首页 > 其他 > 详细

bzoj 3643: Phi的反函数

时间:2017-09-17 20:30:22      阅读:286      评论:0      收藏:0      [点我收藏+]

3643: Phi的反函数

Time Limit: 10 Sec  Memory Limit: 64 MB

Description

技术分享

Input

 

Output

 

Sample Input

4

Sample Output

5

HINT

 

Source

 

Tips:

  自己也没怎么搞懂;

 

Code:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#define MAXN 200008
using namespace std;
long long n,m,prime[MAXN],tot,flag[MAXN],ans;

void init(){
    for(long long i=2;i<=MAXN-8;i++){
        if(!flag[i]){
            flag[i]=1;
            prime[++tot]=i;
        }
        for(long long j=1;j<=tot&&i*prime[j]<=MAXN-8;j++){
            flag[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
}

bool check(long long u){
    for(int i=1;prime[i]*prime[i]<=u;i++){
        if(u%prime[i]==0) return 0;
    }
    return 1;
}

void dfs(long long x,long long y,long long z){
    if(z>=ans) return;
    if(y==1){
        ans=min(ans,z);
        return;
    }
    if(y*y>n&&check(y+1)){
        ans=min(ans,z*(y+1));
        return;
    }
    for(int i=x;prime[i]-1<=y&&(prime[i]-1)*(prime[i]-1)<=n;i++)
    if(y%(prime[i]-1)==0){
        long long xx=y    /(prime[i]-1);
        long long yy=z*prime[i];
        dfs(i+1,xx,yy);
        while(xx%prime[i]==0){
            xx=xx/prime[i];
            yy=yy*prime[i];
            dfs(i+1,xx,yy);
        }
    }
}

int main(){
    tot=0;
    ans=(long long)1<<31;
    init();
    scanf("%lld",&n);
    dfs(1,n,1);
    if(ans==(long long)1<<31){
        printf("-1");
    }else{
        printf("%lld",ans);
    }
}

 

bzoj 3643: Phi的反函数

原文:http://www.cnblogs.com/WQHui/p/7536850.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!