题目连接:https://codeforces.com/contest/1228/problem/C
题目大意:g(x,y)==y^k(其中y^k是X的最大可以整除因子)
f(x,y)==g(x,p1)*(x,p2)....其中pi是x的第i个质因子
求f(x,1)*f(x,2)*f(x,3)---*f(x,n);
题解:对于整数N....N/x==从1到N可以被X整除的个数N/x^2同理。。。
所以我们不妨对每个质因子进行叠加,对于第一个p1,让N多次除以p1,同时记录可以整除的个数,最终我们就可以统计p1的总个数,其他质因子类似。
AC代码:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=1e9+7; const int N=1e5+7; int arr[N]; ll ksm(ll x,ll y){ ll res=1; while(y){ if(y&1) res=(res%mod*x%mod)%mod; y>>=1; x=(x%mod*x%mod)%mod; } return res%mod; } int main(){ ll n,m; cin>>n>>m; ll pos=0; for(ll i=2;i*i<=n;i++){ if(n%i==0){ arr[pos++]=i; while(n%i==0) n/=i; } } if(n!=1) arr[pos++]=n; ll ans=1; for(ll i=0;i<pos;i++){ ll z=m; ll t2=0; while(z){ ll t1=z/arr[i]; z/=arr[i]; t2+=t1; } ans=(ans%mod*ksm(arr[i],t2)%mod)%mod; } cout<<ans<<endl; return 0; }