bzoj3643 Phi的反函数 数学 搜索

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3643

题意:已知$x$,求出$phi(n)==x$的最小$n$。

不得不说今天刷了一堆(相对而言)思博大爆搜之后来这么一道相对有思考价值的数学题真是强啊……

首先我们需要记住一个基本事实:在$int$范围内,每个数的同一个质因数不会成为这个数字的$31$次方,一个数存在的不同质因数不会超过$10$个。

理由很简单:首先$int_max==2147483647$,一定没有任何一个质数$31$次方小于这个数;至于第二个嘛……

这个东西说明了一切……

了解到这个之后,我们再回顾一下欧拉函数的性质,最重要的一点就在于:它是一个积性函数。于是我们就可以对着一个合数进行三种分类讨论:

1)他自己就是一个质数的欧拉函数,那这个质数一定是他再加$1$;

2)他是几个质数乘积,就递归搞下去。

那么我们就爆搜就可以了。预处理出$sqrt(2147483647)$范围内的质数,然后利用这些扫来扫去,最后特判剩下的是不是质数即可。还有一个优化点:可以证明选择的质数一定是递增的,因此直接递增计算即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxn=50000;
 8 int prime[maxn],tot,n;bool notprime[maxn]={1,1};
 9 void shaisushu()
10 {
11     for(int i=2;i<=50000;i++)
12     {
13         if(!notprime[i])prime[++tot]=i;
14         for(int j=1;j<=tot&&i*prime[j]<=50000;j++)
15         {
16             notprime[i*prime[j]]=1;
17             if(!(i%prime[j]))break;
18         }
19     }
20 }
21 long long pro=1;long long ans=2147483648ll;int mudi;
22 bool isprime(int x)
23 {
24     int mubiao=(int)sqrt(x);
25     for(int i=1;prime[i]<=mubiao;i++)
26         if(!(x%prime[i]))return 0;
27     return 1;
28 }
29 void dfs(int now,int num)
30 {
31     int tpro=pro,tt=now;
32     if(pro>=ans)return;
33     if(now==1){ans=min(ans,pro);return;}
34     if(now>mudi&&isprime(now+1)==1)ans=min(ans,pro*1ll*(now+1));
35     if(prime[num]-1>mudi||now<prime[num]-1)return;
36     for(int i=num;prime[i]<=mudi+1;i++)
37     {
38         if(prime[i]-1>now)return;
39         if(!(now%(prime[i]-1)))
40         {
41             now/=(prime[i]-1);pro*=1ll*prime[i];
42             dfs(now,i+1);
43             while(!(now%prime[i]))
44             {
45                 now/=prime[i],pro*=1ll*prime[i];
46                 dfs(now,i+1);
47             }
48             pro=tpro,now=tt;
49         }
50     }
51 }
52 int haha()
53 {
54     scanf("%d",&n);mudi=(int)sqrt(n);shaisushu();
55     dfs(n,1);
56     if(ans<=0x7fffffff)printf("%lld\n",ans);else puts("-1");
57 }
58 int sb=haha();
59 int main(){;}

bzoj3643

时间: 2024-10-11 10:53:15

bzoj3643 Phi的反函数 数学 搜索的相关文章

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

3643: Phi的反函数 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 141  Solved: 96[Submit][Status][Discuss] Description Input Output Sample Input 4 Sample Output 5 HINT Source By Zky Solution 首先答案和N一定是同阶的,所以,可以很暴力的线筛扫一遍求解. 然后根据欧拉函数的式子,我们实际上是可以爆搜的. 爆搜他的质因子然

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 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

bzoj 3643Phi的反函数

3643: Phi的反函数 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 298  Solved: 192[Submit][Status][Discuss] Description Input Output Sample Input 4 Sample Output 5 这道题我只能说是一道披着搜索外衣的数学题,核心都在数学知识上,于是数学能力令人发指的我跪了-- 在讲这道题之前我们先明确一下几点: 1.一个数x的质因子若大于sqrt(x)则这个质因

【网址】数学网址大全

中文数学专业网站:博士家园http://www.math.org.cnhttp://www.bossh.net 数理逻辑.数学基础:http://www.disi.unige.it/aila/eindex.html意大利逻辑及其应用协会的主页,包括意大利数理逻辑领域的相关内容. http://www.plenum.com/title.cgi?2110<代数与逻辑>,<西伯利亚代数与逻辑期刊>的翻译版,荷兰的Kluwer学术出版社提供其在线服务. http://forum.swart

数学系列:数学资源

中文数学专业网站:博士家园 http://www.math.org.cn http://www.bossh.net   数理逻辑.数学基础:http://www.disi.unige.it/aila/eindex.html 意大利逻辑及其应用协会的主页,包括意大利数理逻辑领域的相关内容.   http://www.plenum.com/title.cgi?2110 <代数与逻辑>,<西伯利亚代数与逻辑期刊>的翻译版,荷兰的Kluwer学术出版社提供其在线服务.   http://f

【醒目】【业界偷懒】【Public】BZOJ题目一句话题解整理

就当是复习一下自己做过的题,顺便提供一个简要题解给大家看. 做题时候实在想不出来看一下一句话题解,可以有一个提示的作用又不至于一下子知道了全部浪费了一道题吧.. 部分题目(如我A过得大部分奶牛题)是别人拿我的账号做的,不提供题解. 可能会漏掉很多做过的题..因为可能点页数不小心点错了什么的 UPD.本来想把那些没写过但是知道题解的也写了..但是写完这些已经累死了QAQ 已AC的题目(数学题均不提供分析过程,公式): 1000:A+B 1001:平面图最小割,转对偶图最短路 1002:矩阵树定理,

【STSRM13】花六游鸟小

[题意]给定n个节点的树,每个节点有一个m位二进制数,数字可以随时按位取反,每个数位有一个价值,定义每个点的最大价值是从根到这个点路上的数字(可以取反)或起来的数字中,1有价值0无价值,加起来得到的最大价值. 得到所有点的最大价值后,相邻点若同价值则断边,最后求长度为d的路径数量(边长1),d取遍0到max,依次输出. n<=10^5,m<=200. [算法]数学+搜索 [题解]结论题. 首先最显然的,深度>log m的点一定能达到最大值,因为每次每个串至少能使未取到的数位取一半(不够一

wiki语法大全

Wiki语法大全     编辑一个维客页面十分容易.只要点击页面上方的“编辑本页”或右侧的[编辑]链接即可修改该页,或点击“讨论本页”然后再点击“编辑页面”来讨论该页面.点击后您就会看到一个包含那个Wiki页面的可编辑的文字区域. 先将文字复制到您最喜欢的文字编辑器,编辑并检查后再贴回浏览器预览往往更方便.这样做方便你断线后用您的备份档做修改. 编辑要点 开始编辑 在一个MediaWiki页面开始编辑,您只需点击“编辑本页”或者边上的“编辑”链接就可以编辑该页面.这将带您进入“编辑页面”:一个文