#include #include #include #include #include #include using namespace std; typedef long long LL; typedef pair PII; #define MP make_pair #define PB push_back #define AA first #define BB second #define OP begin() #define ED end() #define SZ size() #define cmin(x,y) x=min(x,y) #define cmax(x,y) x=max(x,y) const LL MOD = 1000000007; const int MXN = 200005; int mu[MXN], p[MXN], pn; bool flag[MXN]; void init(int n=MXN-5) { pn = 0; mu[1] = 1; for(int i = 2; i <= n; i++) { if(!flag[i]) { p[pn ++ ] = i; mu[i] = -1; } for(int j = 0; j < pn && i * p[j] <= n; j++) { flag[i * p [j]] = true; if(i % p[j] == 0) { mu[i * p[j]] = 0; break; } else mu[i * p[j]] = -mu[i]; } } } LL inv[200005]; LL fact[200005]; LL ifac[200005]; LL comb(LL a,LL b){ return fact[a]*ifac[b]%MOD*ifac[a-b]%MOD; } LL play(int n,int m){ return comb(n+m-1,n-1); } int N,M,K,n; LL solve(int n,int M){ LL ans=0; for(int i=0;i<=n&&i*K<=M;i++){ LL mul=comb(n,i); LL add=play(n,M-i*K); if(i&1)ans-=mul*add%MOD; else ans+=mul*add%MOD; } return ans%MOD; } LL g(int x){ int d=n/x; if(M%d)return 0; return solve(x,M/d); } LL gao(int x){ int y=x; vectorL; for(int i=2;i*i<=x;i++)if(x%i==0){ L.PB(i); while(x%i==0)x/=i; } if(x>1)L.PB(x); x=y; LL ret=0; for(int i=0;i<1<>j&1) d*=L[j],mu=-mu; ret+=mu*inv[d]; } return ret%MOD; } int main(){ init(); int i,j,_T; for(inv[0]=inv[1]=1,i=2;i<=200001;i++) inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD; for(fact[0]=i=1;i<=200001;i++) fact[i]=fact[i-1]*i%MOD; for(ifac[0]=i=1;i<=200001;i++) ifac[i]=ifac[i-1]*inv[i]%MOD; scanf("%d",&_T); for(int CA=1;CA<=_T;CA++){ scanf("%d%d%d",&N,&M,&K); printf("Case #%d: ",CA); n=N-M; if(n==0)printf("%d\n",N>=K?0:1); else { int gg=__gcd(n,M); setSD; for(i=1;i*i<=gg;i++)if(gg%i==0) SD.insert(i),SD.insert(gg/i); vectorD(SD.OP,SD.ED); LL ans=0; mapW; for(i=0;i::iterator it=W.OP;it!=W.ED;++it) ans+=(*it).BB%MOD*g((*it).AA); ans=(ans%MOD+MOD)%MOD; printf("%d\n",int(ans)); } } return 0; }