codeforces 893E Counting Arrays (組合數學)
阿新 • • 發佈:2018-12-26
//C n+m-1 m; //2^(y-1); #include<stdio.h> #include<string.h> #include<math.h> #include<vector> using namespace std; vector<int>v[1000500]; const int mod=1000000007; int cur[1000500]; long long inv[2000050]; long long fc[2000050]; long long vv[1000500]; long long f(long long a,long long b); void init() { memset(cur,0,sizeof(cur)); fc[0]=1LL; for(int i=1;i<2000000;i++) fc[i]=fc[i-1]*i%mod; for(int i=0;i<2000000;i++) inv[i]=f(fc[i],mod-2); for(int i=1;i<=1000000;i++) vv[i]=i; cur[1]=1; for(int i=2;i<=1000000;i++) { if(!cur[i]) { v[i].push_back(1); for(int j=i+i;j<=1000000;j+=i) { cur[j]=1; int q=0; while(vv[j]%i==0) { q++; vv[j]/=i; } v[j].push_back(q); } } } } long long f(long long a,long long b) { long long c=1; while(b) { if(b&1) { c*=a; c%=mod; } a*=a; a%=mod; b>>=1; } return c; } int main() { init(); int T; scanf("%d",&T); while(T--) { long long x,y; scanf("%lld%lld",&x,&y); long long ans=1; for(int i=0;i<v[x].size();i++) { int q=v[x][i]; ans=ans*fc[q+y-1]%mod*inv[q]%mod*inv[y-1]%mod; } //printf("!! %lld\n",ans); //printf("~~ %lld\n",f(2,y-1)); ans*=f(2,y-1); ans%=mod; printf("%lld\n",ans); } }