A Research Problem UVA - 10837 欧拉函数逆应用

平时看到的题目是给n求phi(n) 现在是给phi(n)求一个最小n

当一个数为素数是m=n*(1-1/n);

例如 12=13(1-1/13);所以可以得出 m%(n-1)==0 时,n-1为n的素因子

m=n*(1-1/p1)*(1-1/pn);

n=p1^x1*(p1-1)*p2^x2(p2-1)......;

#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define ll long long
#define INF 1000000
#include<time.h>

using namespace std;
#define ll long long
#define maxn 10005
#define ULL unsigned long long
#define MST(vis,x) memset(vis,x,sizeof(vis))
#define tempmaxn 200000000

int vis[maxn];
int prim[maxn];
int all;
void init()
{
    all=1;
    for(int a=2; a<=10000; a++)
    {
        if(vis[a]==0)
            prim[all++]=a;
        for(int b=1; b<all&&prim[b]*a<=10000; b++)
        {
            vis[prim[b]*a]=1;
            if(a%prim[b]==0)break;
        }
    }
    return;
}
int ans;
int s1[maxn],vs[maxn];
int op;
void getprim(int n)
{
    for(int a=1; (a<all)&&(prim[a]-1)*(prim[a]-1)<=n; a++)
        if(n%(prim[a]-1)==0)
            s1[op++]=prim[a];
    return;
}
bool judge(int n)
{
    if(n==2)return true;
    for(int a=1;a<all&&prim[a]*prim[a]<=n;a++)
        if(n%prim[a]==0)
            return false;
    for(int a=1;a<op;a++)
        if(vs[a]&&s1[a]==n)
            return false;
    return true;
}
void cir(int tempsum,int tempn,int tempop)
{
    if(tempop==op)
    {
        if(judge(tempn+1))
        {
            if(tempn==1)
                tempn=0;
            ans=min(ans,tempsum*(tempn+1));
        }
        return;
    }
    cir(tempsum,tempn,tempop+1);
    if(tempn%(s1[tempop]-1)==0)
    {
        vs[tempop]=1;
        tempn/=(s1[tempop]-1);
        tempsum*=s1[tempop];
        while(true)
        {
            cir(tempsum,tempn,tempop+1);
            if(tempn%s1[tempop]==0)
            {
                tempn/=s1[tempop];
                tempsum*=s1[tempop];
            }
            else return ;
        }
        vs[op]=0;
    }
    return;
}
int solve(int n)
{
    ans=0x3f3f3f3f;
    op=1;
    MST(vs,0);
    MST(s1,0);
    getprim(n);
    cir(1,n,1);
    if(ans==INF)ans=0;
    return ans;
}
int main()
{
    init();
    int n,i=1;
    while(scanf("%d",&n)!=EOF)
    {
        if(!n)break;
        printf("Case %d: %d %d\n",i++,n,solve(n));
    }
    return 0;
}
时间: 2024-11-05 14:50:26

A Research Problem UVA - 10837 欧拉函数逆应用的相关文章

UVa 10837 (欧拉函数 搜索) A Research Problem

发现自己搜索真的很弱,也许做题太少了吧.代码大部分是参考别人的,=_=|| 题意: 给出一个phi(n),求最小的n 分析: 回顾一下欧拉函数的公式:,注意这里的Pi是互不相同的素数,所以后面搜索的时候要进行标记. 先找出所有的素数p,满足(p - 1)整除题目中所给的phi(n) 然后暴搜.. 素数打表打到1e4就够了,如果最后剩下一个大素数单独进行判断. 1 #include <cstdio> 2 #include <cmath> 3 #include <cstring&

hdu 5152 A Strange Problem线段树+欧拉函数

*****************************************BC题解**********************************************************************1003 A Strange Problem 对于操作二,利用公式 当x >= Phi(C), A^x = A ^ (x%Phi(C) + Phi(C)) (mod C) 对于2333333这个模数来说,求18次欧拉函数后就变成了1,所以只需要保存19层第三次操作的加数

UVa 11440 (欧拉函数) Help Tomisu

题意: 给出N和M,统计区间x ∈ [2, N!],x满足所有素因子都大于M的x的个数. 分析: 首先将问题转化一下,所有素因子都大于M 等价于 这个数与M!互素 对于k大于M!,k与M!互素等价于 k % M! 与 M!互素 所以我们可以求出φ(M!)(φ为欧拉函数) 然后乘以N! / M!,最后答案再减一(因为是从2开始统计的) 欧拉函数的公式为a phifac[n] = φ(n!),我们递推求phifac 当n为合数时,n!和(n-1)!的素因数的集合是一样的,所以phifac[n] =

UVa 11426 (欧拉函数 GCD之和) GCD - Extreme (II)

题意: 求sum{gcd(i, j) | 1 ≤ i < j ≤ n} 分析: 有这样一个很有用的结论:gcd(x, n) = i的充要条件是gcd(x/i, n/i) = 1,因此满足条件的x有phi(n/i)个,其中Phi为欧拉函数. 所以枚举i和i的倍数n,累加i * phi(n/i)即可. 1 #include <cstdio> 2 typedef long long LL; 3 4 const int maxn = 4000000; 5 6 int phi[maxn + 10]

UVA - 10820欧拉函数的应用

这是一道很基础的欧拉函数的题目 题意要求  (x,y) 互质 &&x<=n&&y<=n 求互质对数 可以运用容斥,求出 phi(n)=n(1-1/n1)(1-1/n2)......(1-1/nk); 因为(2,4) (4,2) 算两对,所以 答案为 2*f(n)+1; #include<stdio.h> #include<string.h> #include<stdlib.h> #include<iostream>

UVA 11426 (欧拉函数&amp;&amp;递推)

题意:给你一个数N,求N以内和N的最大公约数的和 解题思路: 一开始直接想暴力做,4000000的数据量肯定超时.之后学习了一些新的操作. 题目中所要我们求的是N内gcd之和,设s[n]=s[n-1]+gcd(1,n)+gcd(2,n)+gcd(3,n)+gcd(4,n)....... 再设f[n]=gcd(1,n)+gcd(2,n)+gcd(3,n)+gcd(4,n).......; 思考一下,假设gcd(x,n)=ans,ans便是x和n的最大公约数,那么有几个ans我们将某ans的个数su

欧拉函数专题

poj 2478 http://poj.org/problem?id=2478 欧拉函数基础题,记得会超long long 就好了 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <stack> using namespace std; const int maxn=10000

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

UVA 10837 - A Research Problem 题目链接 题意:给定phi(n),求最小满足的最小的n 思路:phi(n)=pk11(p1?1)?pk22(p2?1)?pk33(p3?1)....(p为质数),因此对于给定phi(n),先把满足条件phi(n)%(p?1)=0的素数全找出来,在这些素数基础上进行暴力搜索,枚举哪些素数用与不用,求出最小值.这样做看似时间复杂度很高,但是实际上,由于每次多选一个素数之后对于值是呈指数上升的,所以实际组合出来的情况并不会太多,因此是可行的

uva 10837 - A Research Problem(欧拉函数+暴力)

题目链接:uva 10837 - A Research Problem 题目大意:给定一个phin,要求一个最小的n,欧拉函数n等于phin 解题思路:欧拉函数性质有,p为素数的话有phip=p?1;如果p和q互质的话有phip?q=phip?phiq 然后根据这样的性质,n=pk11(p1?1)?pk22(p2?1)???pkii(pi?1),将所有的pi处理出来,暴力搜索维护最小值,虽然看上去复杂度非常高,但是因为对于垒乘来说,增长非常快,所以搜索范围大大被缩小了. #include <cs