标签:必须 pre main ios 现在 ons lan 快速 公约数
Input
Output
Sample Input
2 4
Sample Output
12
Hint
然后用容斥原理枚举最大公约数不为 1 的个数,也就是对M的所有质因子进行排列,因为最大公因子不为1,那一定是M的个别因子的组合,假设最大公约数为n,那么除了M其他N个数
必须都是N 的倍数,因此一共有M/n个数可以选择(由于这里是质因子,我们直接除就可以啦,不用求LCM啦)。。共有KSM(M/n,N)中选择(快速幂)
然后就是容斥的奇加偶减 最后一步 用总的减去gcd不为1的就是最后答案
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; const int N=1E6+7; ll arr[N]; ll ksm(ll x,ll y){ ll res=1; while(y){ if(y&1) res=res*x; x=x*x; y>>=1; } return res; } ll zfj(ll m){ ll pos=0; for(ll i=2;i*i<=m;i++){ if(m%i==0){ arr[pos++]=i; while(m%i==0){ m/=i; } } } if(m>1){ arr[pos++]=m; } return pos; } int main(){ ll n,m; cin>>n>>m; ll pos=zfj(m); ll s=0; for(int i=1;i<(1<<pos);i++){ ll cnt=0; ll sum=1; for(int j=0;j<pos;j++){ if(1&(i>>j)){ cnt++; sum*=arr[j]; } } if(cnt&1) { s+=ksm(m/sum,n); } else { s-=ksm(m/sum,n); } } printf("%lld\n",ksm(m,n)-s); return 0; }
标签:必须 pre main ios 现在 ons lan 快速 公约数
原文地址:https://www.cnblogs.com/Accepting/p/11360416.html