【BZOJ-3643】Phi的反函数 数论 + 搜索

3643: Phi的反函数

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 141  Solved: 96
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

4

Sample Output

5

HINT

Source

By Zky

Solution

首先答案和N一定是同阶的,所以,可以很暴力的线筛扫一遍求解。

然后根据欧拉函数的式子,我们实际上是可以爆搜的。

爆搜他的质因子然后去凑答案,加最优性剪枝就可以跑过。

最关键的是依据欧拉函数的定义式找到规律!

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define LL long long
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<‘0‘ || ch>‘9‘) {if (ch==‘-‘) f=-1; ch=getchar();}
    while (ch>=‘0‘ && ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
#define MAXN 5100000
int X,N;
int prime[MAXN],flag[MAXN],cnt;
void Getprime()
{
    flag[1]=1; cnt=0;
    for (int i=2; i<=N; i++)
        {
            if (!flag[i]) prime[++cnt]=i;
            for (int j=1; j<=cnt && prime[j]*i<=N; j++)
                {
                    flag[i*prime[j]]=1;
                    if (prime[j]%i==0) break;
                }
        }
}
LL ans=(1LL<<30);
LL sqr(LL x) {return (LL)x*x;}
bool check(int x)
{
//  if (flag[x]) return 0;
    for (int i=1; sqr(prime[i])<=x && i<=cnt; i++) if (x%prime[i]==0) return 0;
    return 1;
}
void DFS(int dep,LL sum,LL x,int last)
{
    if (sum>=ans) return;
    if (x==1) {ans=sum; return;}
    if (check(x+1) && sqr(x)>X) ans=min(ans,sum*(x+1));
    for (int i=last+1; (prime[i]-1)<=x && sqr(prime[i]-1)<=X; i++)
        if (!(x%(prime[i]-1)))
            {
                LL xx=(LL)x/(prime[i]-1),summ=(LL)sum*prime[i];
                DFS(dep+1,summ,xx,i);
                while (!(xx%prime[i])) xx=(LL)xx/prime[i],summ=(LL)summ*prime[i],DFS(dep+1,summ,xx,i);
            }
}
int main()
{
    X=read();  N=int(sqrt(X))+1010;
    if (X==1) {puts("1"); return 0;}
    Getprime();
    DFS(1,1LL,(LL)X,1);
    printf("%lld\n",ans==(1LL<<30)? -1:ans);
    return 0;
}

仔细思考一下应该是可以想到的。

时间: 2024-12-26 04:27:12

【BZOJ-3643】Phi的反函数 数论 + 搜索的相关文章

bzoj 3643: Phi的反函数

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

bzoj3643 Phi的反函数 数学 搜索

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3643 题意:已知$x$,求出$phi(n)==x$的最小$n$. 不得不说今天刷了一堆(相对而言)思博大爆搜之后来这么一道相对有思考价值的数学题真是强啊-- 首先我们需要记住一个基本事实:在$int$范围内,每个数的同一个质因数不会成为这个数字的$31$次方,一个数存在的不同质因数不会超过$10$个. 理由很简单:首先$int_max==2147483647$,一定没有任何一个质数$31$次

bzoj3643 Phi的反函数

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3643 [题解] n = p1^a1*p2^a2*...*pm^am phi(n) = p1(p1-1)^(a1-1)*p2(p2-1)^(a2-1)*...*pm^(am-1) 最多有10个不同的质因数就超过maxint了,这告诉我们可以搜索 我们假设p1<p2<p3<...<pm 那么我们处理出<sqrt(n)的质数,因为我们只会用到这些质数来搜(因为其他平方完就爆炸

【BZOJ】【2219】数论之神

中国剩余定理+原根+扩展欧几里得 题解:http://blog.csdn.net/regina8023/article/details/44863519 新技能get√: 1 LL Get_yuangen(LL p,LL phi){ 2 int c=0; 3 for(int i=2;i*i<=phi;i++) 4 if (phi%i==0) 5 f[++c]=i,f[++c]=phi/i; 6 for(int g=2;;g++){ 7 int j; 8 for(j=1;j<=c;j++) if

[BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS 验证在当前枚举的步数之内能否到达目标状态. 如果不能到达,就枚举下一个步数,重新搜索,即使某些状态在之前的 DFS 中已经搜索过,我们仍然搜索. 并且在一次 DFS 中,我们不需要判定重复的状态. 在 IDA* 中,重要的剪枝优化是 估价函数 ,将一些不可能存在可行解的枝条剪掉. 如果估价函数写得

BZOJ 2226: [Spoj 5971] LCMSum( 数论 )

∑lcm(i,n) = ∑ i*n/(i,n) = ∑d|n∑(x,n)=d x*n/d = ∑d|n∑(t,n/d)=1t*n = n∑d|nf(d). f(d)表示1~d中与d互质的数的和, 即f(d) = d*φ(d)/2(d>=2). 然后O(n)筛φ, 每次询问暴力算即可...最大是100w,sqrt(100w)=1000内的质数是168个, 所以复杂度是O(n + T*168), 可以AC  ----------------------------------------------

BZOJ 3895: 取石子[SG函数 搜索]

有N堆石子 ·从某堆石子中取走一个 ·合并任意两堆石子 不能操作的人输. 100%的数据满足T<=100,  N<=50. ai<=1000 容易发现基础操作数$d=\sum a_i +n-1$ 没有个数为1的堆还好说,有的话@#$%^&好麻烦啊啊啊啊啊怎么可能找规律 然后看题解,woc记忆化搜索 $f(i,j)$表示i个个数为1的堆,其他操作数为j的胜负态 枚举操作转移就行了,一定要枚举对!注意$j=1$时 #include <iostream> #include

bzoj 1053: [HAOI2007]反素数ant 搜索

1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1497  Solved: 821[Submit][Status] Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? Input 一个数N

【bzoj 3233】[Ahoi2013]找硬币 ——搜索

Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125,250就是一组合法的硬币序列,而1,5,100,125就不是.不知从哪一天开始,可爱的蛇爱上了一种萌物——兔纸!从此,小蛇便走上了遇上兔纸娃娃就买的不归路.某天,小蛇看到了N只可爱的兔纸,假设这N 只兔纸的价钱分别是a1,a2…aN.现在小蛇想知道,在哪一组合法的硬币序列下,买这N只兔纸所需要的硬币数最少