您的位置:首页 > 其它

BZOJ 3643: Phi的反函数 搜索

2017-10-09 09:50 423 查看

3643: Phi的反函数

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 344  Solved: 217

[Submit][Status][Discuss]

Description



Input

Output

Sample Input

4

Sample Output

5

在校OJ考试出了这题,然后没写。。。

再然后,标程被暴力bi——了

谁出的数据。。。骂他。。。

先贴个暴力

#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<map>
#include<set>
using namespace std;

typedef long long ll;

inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
void print(int x)
{if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}

const int N=200100;

int prime[N>>3],pcnt;
bool book
;

void initial()
{
register int i,j,cnt=0;
for(i=2;i<N;++i)
{
if(!book[i])prime[++cnt]=i;
for(j=1;j<=cnt&&i*prime[j]<N;++j)
{
book[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
pcnt=cnt;
}

inline int get_phi(int x)
{
register int i,p,res=x;
for(i=1;i<=pcnt&&prime[i]*prime[i]<=x;++i)
{
p=prime[i];
if(x%p==0)
{
res/=p;res*=p-1;
while(x%p==0)x/=p;
}
}
if(x^1)res/=x,res*=x-1;
return res;
}

int main()
{
initial();
int x=read();
if(x==1){puts("1");return 0;}
if(x&1){puts("-1");return 0;}
ll tmp=min(ll(x)<<1,ll((1<<31)-1)),now=x+1;
while(now<=tmp)if(get_phi(now)==x){cout<<now<<endl;return 0;}else now++;
puts("-1");return 0;
}


之后是正解,不过正解好像也是暴力??

爆搜把n分解,之后就OK了

#include<cmath>
#include<ctime>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<string>
#include<bitset>
#include<queue>
#include<map>
#include<set>
using namespace std;

typedef long long ll;

inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
void print(int x)
{if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}

const int N=200100;

int prime[N>>3],pcnt;
bool book
;

void initial()
{
register int i,j,cnt=0;
for(i=2;i<N;++i)
{
if(!book[i])prime[++cnt]=i;
for(j=1;j<=cnt&&i*prime[j]<N;++j)
{
book[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
pcnt=cnt;
}

ll ans=(1ll<<31);

inline bool check(int x)
{
if(x<N)return !book[x];
for(int i=1;i<=pcnt&&prime[i]*prime[i]<=x;++i)if(x%prime[i]==0)return 0;
return 1;
}

void dfs(int step,int aim,ll now)
{
if(now>=ans)return ;
if(aim==1){ans=now;return ;}
if(check(aim+1))dfs(1,1,now*(aim+1));
for(int i=step,tmp,p;i<=pcnt&&(prime[i]-1)*(prime[i]-1)<=aim;++i)
{
tmp=prime[i]-1;p=prime[i];
while(aim%tmp==0)
{
dfs(i+1,aim/tmp,now*p);
tmp*=prime[i];p*=prime[i];
}
}
}

int main()
{
int n=read();
if(n==1){puts("1");return 0;}
if(n&1){puts("-1");return 0;}
initial();
dfs(1,n,1);
ans==(1ll<<31)?puts("-1"):(print(ans),puts(""));return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: