A Research Problem UVA - 10837 (欧拉函数定义)

原文地址

 

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=b-1;i>=a;i--)

const int maxn=1e5+10;
int cnt_pri;
int pri[maxn];
bool vis[maxn];

/*
知识点phi(n)=m的分解式
然后再去枚举所有因子的情况,找到最小的解n

注意:看到i*i<=m,我们只是筛选了 sqrt(m)以内的因子,后面的因子我们是没有判断的 //!!!效率问题
      但不代表着,我们可以忽略;  //!!!准确度的问题
      
*/
void get_prime(int M){
    cnt_pri=0;
    for(int i=2;i<=M;i++){
         if(!vis[i]){
            pri[cnt_pri++]=i;
            for(int j=i*i;j<=M;j+=i)
                vis[j]=true;
         }
    }
    //printf("cnt_pri:%d\n",cnt_pri);
}

int cnt;
int p[maxn];

int used[maxn];

int judge(int x){
/*
   int m=sqrt(x+0.5);
   rep(i,2,m+1)if(x%i==0)return false;
*/
   // printf("x:%d\n",x);

    for(int i=0;i<cnt_pri&&pri[i]*pri[i]<=x;i++){
        if(x%pri[i]==0)return false;
    }
    rep(i,0,cnt) if(used[i]&&p[i]==x)return false;
    return true;
}

int ans;
void dfs(int res,int has,int pos){
    //printf("res:%d has:%d pos:%d\n",res,has,pos);
    if(pos==cnt){
        if(has==1)ans=min(ans,res);
        else if(judge(has+1)){//!!!
            res*=(has+1);
            ans=min(ans,res);
        }
        return;
    }
    dfs(res,has,pos+1);
    if(has%(p[pos]-1))return;

    used[pos]=true;

    res*=p[pos],has/=(p[pos]-1);
    dfs(res,has,pos+1);

    while(has%p[pos]==0){
        res*=p[pos];
        has/=p[pos];
        dfs(res,has,pos+1);
    }
    used[pos]=0;
}


int solve(int m){
    cnt=0;
    for(int i=0;i<cnt_pri&&(pri[cnt_pri]-1)*(pri[cnt_pri]-1)<=m;i++){//!!!
        if(m%(pri[i]-1)==0){
            p[cnt++]=pri[i];
        }
    }
    //printf("cnt:%d\n",cnt);
    //rep(i,0,cnt)printf("i:%d %d\n",i,p[i]);
    memset(used,0,sizeof(used));
    ans=200000000;
    dfs(1,m,0);
    return ans;
}

int main(){
    //freopen("123.txt","w",stdout);
    get_prime(1e4);
    int m,kase=1;
    while(scanf("%d",&m)==1&&m){
        printf("Case %d: %d %d\n",kase++,m,solve(m));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36424540/article/details/81385633