您的位置:首页 > 其它

bzoj3884 上帝与集合的正确用法

2017-09-06 21:54 232 查看
题目

又是一道数学题,233

这样的式子,我们用欧拉公式吧。。。



然后呢发现这是可以直接递归下去算的。

#include<bits/stdc++.h>
#define N 10000000
#define LL long long
using namespace std;
int phi[N+1],prime[N+1],siz;
bool noprime[N+1];
LL p,T;
void init()
{
noprime[1]=true;
phi[1]=1;
for(LL i=2;i<=N;i++)
{
if(!noprime[i])
{
prime[++siz]=i;
phi[i]=i-1;
}
for(LL j=1;j<=siz&&i*prime[j]<=N;j++)
{
noprime[i*prime[j]]=true;
if(i%prime[j]==0)
{
phi[prime[j]*i]=phi[i]*prime[j];
break;
}
phi[prime[j]*i]=phi[i]*phi[prime[j]];
}
}
}
LL ksm(LL A,LL B,LL C)
{
LL Ans=1;
while(B)
{
if(B&1)Ans=(Ans*A)%C;
A=(A*A)%C;
B>>=1;
}
return Ans;
}
LL f(LL x)
{
if(x==1)return 0;
return ksm(2,f(phi[x])+phi[x],x);
}
int main()
{
scanf("%lld",&T);
init();
while(T--)
{
scanf("%lld",&p);
printf("%lld\n",f(p));
}
return 0;
}


复杂度O(log p)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: