[BZOJ]3737 [Pa2013]Euler
从这个FB开始写博客啦。
也不知道会坚持多久……
= =似乎要加一句转载请注明出处 http://www.cnblogs.com/DancingOnTheTree/p/4026076.html
http://www.lydsy.com/JudgeOnline/problem.php?id=3737
因为是好玩的数学题所以刚看见的时候就想捉了……但是无限耽搁这两天才处理掉。
交上去各种瑕疵CE……
改好发现数组开小各种RE……
然后各种TLE……
小看数据了= =。
看到题拿各种公式套,似乎是按因数来搜索。咦用2的幂次作深度上界估计似乎能搜?用质数前缀积上界似乎更小?
然后就暴搜吧……
原理是对任意phi(x)=n的x,它的所有素因子-1的积必被n整除。
所以跟先找哪个就没关系了,多了一个下界剪枝。
然后枚举可能的质数的时候只要枚举不超过sqrt(n)的……否则有两种情况。
1、此时x有两个及以上的素因数,那么一定有一个素因数-1是n小于sqrt(n)的因数,不可能找完大于sqrt(n)再回过来找它……
2、x是质数,也就是特判一下n+1是不是质数了。
虽然把第二种情况加了Miller_Rabin还是T了……
WTF!太假了!
然后发现能卡我的大多是类似那些高合成数的……总之要判的n+1一般不大。
于是把素数表打大一点,n+1小的时候直接在表里找就过了。
最后回过头证明一下搜索能硬上……
设F(k)为前k个质数积,f为其反函数。易知搜索树的宽度深度都是f(n) (n还要变小呢)
而f(n)的话……记得以前推出来是logn/loglogn,错了求不D。
然后按传统要羞耻地贴代码喽?……估计不对着代码看也蛮难看懂的。
#include<cstdio>#include<algorithm>#include<cmath>#include<cstdlib>#include<cstring>using namespace std;typedef long long LL;#define rep(i,j,n) for(int i=j;i<=n;i++)char c;template<class T> inline void read(T&x){for(c=getchar();c<'0'||c>'9';c=getchar());for(x=0;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';};bool t[4010010];LL n,p[1000000],ans[1000000];int T,tot,tott,len,S=10;void pre(){ memset(t,true,sizeof(t)); rep(i,2,4010000) if(t[i]){ p[++len]=i; rep(j,i,4010000/i) t[i*j]=false; }}inline LL muti_mod(LL a,LL b,LL c){ a%=c; b%=c; LL ret=0; while(b){ if(b&1){ret+=a;if(ret>=c)ret-=c;} a<<=1; if(a>=c)a-=c; b>>=1; } return ret;}inline LL pow_mod(LL x,LL n,LL mod){ if(n==1)return x%mod; int bit[50],k=0; while(n){ bit[k++]=n&1; n>>=1; } LL ret=1; for(;k>0;k--){ ret=muti_mod(ret,ret,mod); if (bit[k-1]==1) ret=muti_mod(ret,x,mod); } return ret;}inline bool check(LL a,LL n,LL x,LL t){ LL ret=pow_mod(a,x,n),last=ret; for(int i=1;i<=t;i++){ ret=muti_mod(ret,ret,n); if(ret==1&&last!=1&&last!=n-1) return true; last=ret; } if(ret!=1) return true; return false;}inline bool prime(LL n){ if(n<2)return false; if(n==2)return true; if((n&1)==0) return false; LL x=n-1;LL t=0; while((x&1)==0){x>>=1;t++;} for(int i=0;i<S;i++) { LL a=rand()%(n-1)+1; if(check(a,n,x,t)) return false; } return true;}void find(LL n,int list,LL now){ if(n==1){ans[tot++]=now;return;} if(1&n) return; LL N=now,m,maxi=int(sqrt(n))+1; rep(i,list,len) if(p[i]>maxi)break;else if(n%(p[i]-1)==0){ m=n/(p[i]-1); N*=p[i]; find(m,i+1,N); while(m%p[i]==0){ m/=p[i];N*=p[i]; find(m,i+1,N); } N=now; } if(n+1>=p[list]){ if(n+1>p[len]){if(prime(n+1))ans[tot++]=N*(n+1);} else{if(t[n+1])ans[tot++]=N*(n+1);} }}int main(){ read(T); pre(); while(T--){ read(n);tot=0; if(1&n){ if(n==1){puts("2");puts("1 2");}else puts("0"),puts(""); continue; } find(n,1,1); sort(ans,ans+tot); printf("%d\n",tot); rep(i,0,tot-2) printf("%lld ",ans[i]); if(tot)printf("%lld\n",ans[tot-1]);else{puts("");}; }}[BZOJ]3737 [Pa2013]Euler的更多相关文章
- 【BZOJ】3737: [Pa2013]Euler
题意: 求满足\(phi(a)=n\)的\(a\)的个数.(\(n \le 10^{10}\)) 分析 这种题一开始就感觉是搜索= = 题解 首先容易得到 \[\phi(n) = \prod_{i} ...
- bzoj 3837 pa2013 Filary
bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...
- BZOJ 3736: [Pa2013]Karty
Description 一个0/1矩阵,求能覆盖所有 \(1\) ,同时不覆盖所有 \(0\) 的矩阵,使这个面积最大. Sol DP/悬线法. 首先,所求的矩阵一定可以覆盖所有贴边的悬线. 用悬线法 ...
- BZOJ3737 : [Pa2013]Euler
首先枚举$n$的每个约数$d$,检查一下$d+1$是否是质数,这些数都有可能作为答案的质因子出现. 考虑爆搜,每次枚举下一个要在答案中出现的质因子$p$,将$n$除以$p-1$,再枚举$p$的指数,然 ...
- BZOJ 3733 [Pa2013]Iloczyn 模拟爆搜
Description 给定正整数n和k,问能否将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示测试组数 接下来T行每行两个数n(n<=10^9),k(k& ...
- bzoj 3733: [Pa2013]Iloczyn【dfs】
参考:http://www.cnblogs.com/clrs97/p/5125976.html 瞎搞约数失败...滚去搜索 dfs(x,y,z) 表示当前可选第x到第m个约数,还要选y个约数,已有z的 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法
给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sampl ...
- bzoj 2820 YY的GCD - 莫比乌斯反演 - 线性筛
Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必 ...
随机推荐
- 转:FIFO的定义与作用
一.先入先出队列(First Input First Output,FIFO)这是一种传统的按序执行方法,先进入的指令先完成并引退,跟着才执行第二条指令. 1.什么是FIFO? FIFO是英文Firs ...
- 来晚了--SALTSTACK要弄起
PUPPET就算了,我多少都有PYTHON基础,还是专SALTSTACK吧. 今天小玩玩,以后深入.
- Chrome不支持NPAPI的信息与替代方案
昨天Chrome稳定版更新到了42版,发现百度云.支付宝.网银等等的插件都失效了,打开 chrome://plugins/ 一看,NPAPI都消失了,只有flash的插件还在.解决办法是到 chrom ...
- POJ3687 Labeling Balls(拓扑)
题目链接. 题目大意: N个球,从1-N编号,质量不同,范围1-N,无重复.给出小球间的质量关系(<), 要求给每个球贴标签,标签表示每个球的质量.按编号输出每个球的标签.如果解不唯一,按编号小 ...
- -_-#【Backbone】Collection
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- gtest代码库浅析
代码库工程概述 IDE:Visual Studio 2010 sln路径:gtest\msvc\gtest.sln 用IDE打开上面的sln,可以看到以下四个工程,算不上复杂.展开之后更是感觉这几个工 ...
- ObsoleteAttribute 可适用于除程序集、模块、参数或返回值以外的所有程序元素。 将元素标记为过时可以通知用户:该元素在产品的未来版本中将被移除。
官方文档:https://msdn.microsoft.com/zh-cn/library/system.obsoleteattribute(v=vs.110).aspx 备注 ObsoleteAtt ...
- QE是什么
量化宽松(Quantitative Easing,简称QE),是一种货币政策,主要指各国央行通过公开市场购买政府债券.银行金融资产等做法.量化宽松直接导致市场的货币供应量增加,可视为变相“印钞”.市场 ...
- 注释PHP和html混合代码
<?php if(false){ ?> any code <?php } ?>
- JSP元素和标签
1.JSP 的运行原理 当服务器上的一个JSP 页面被第一次请求执行时,服务器上的JSP引擎首先将JSP 页面文件转译成一个java 文件,再将这个java 文件 编译生成字节码文件,然后通过执行字 ...