C. Primes and Multiplication

题目连接: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;
}

猜你喜欢

转载自www.cnblogs.com/Accepting/p/11735296.html