BZOJ 3643: Phi的反函数 搜索
2017-10-09 09:50
423 查看
3643: Phi的反函数
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 344 Solved: 217
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
4Sample 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;
}
相关文章推荐
- BZOJ 3643|Phi的反函数|搜索|线性筛法
- bzoj 3643:Phi的反函数 (数论+搜索)
- [BZOJ3643]Phi的反函数(数学相关+搜索)
- 【BZOJ-3643】Phi的反函数 数论 + 搜索
- 【NOIP 模拟题】【bzoj 3643】Phi的反函数(数论+搜索)
- 【BZOJ 3643】Phi的反函数 数搜索
- BZOJ3643 Phi的反函数(数论+搜索)
- bzoj3643 Phi的反函数
- [BZOJ3643]Phi的反函数(数论+dfs)
- BZOJ 3643 Phi的反函数
- [BZOJ3643] phi的反函数 - 欧拉函数 - dfs
- BZOJ 3643 Phi的反函数
- 【BZOJ3643】phi的反函数,暴搜
- BZOJ3643-欧拉函数,搜索
- 【BZOJ 3642】Phi的反函数
- bzoj3643 Phi的反函数 搜索
- [暴力搜索 剪枝 约数和反函数] BZOJ 3629 [JLOI2014]聪明的燕姿
- 【BZOJ4345】[POI2016]Korale 堆(模拟搜索)
- BZOJ 1082 栅栏 [二分+搜索]
- BZOJ 2464: 中山市选[2009]小明的游戏 简单搜索