您的位置:首页 > 其它

poj 1091 跳蚤 扩展欧几里得+容斥原理

2016-05-03 15:37 330 查看
//poj 1091
//sep9
#include <iostream>
using namespace std;
typedef long long ll;

ll n,m,p[128];
int cnt;

void init()
{
cnt=0;
ll mm=m;
for(ll i=2;i*i<=mm;++i){
if(mm%i==0){
p[cnt++]=i;
while(mm%i==0)
mm/=i;
}
}
if(mm>1)
p[cnt++]=mm;
}

ll quick_power(ll a,ll b)
{
ll res=1;
while(b){
if(b&1)
res*=a;
a*=a;
b/=2;
}
return res;
}

int main()
{
scanf("%lld%lld",&n,&m);
init();
ll ans=0;
for(int s=0;s<(1<<cnt);++s){
int num=0;
ll tmp=1;
for(int i=0;i<cnt;++i)
if((s>>i)&1){
++num;
tmp*=p[i];
}
ll tmp_ans=quick_power(m/tmp,n);
if(num%2==0) ans+=tmp_ans;
else ans-=tmp_ans;
}
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj