[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这种 傻×必 ...
随机推荐
- Solr4.8.0源码分析(5)之查询流程分析总述
Solr4.8.0源码分析(5)之查询流程分析总述 前面已经写到,solr查询是通过http发送命令,solr servlet接受并进行处理.所以solr的查询流程从SolrDispatchsFilt ...
- 【java】基于Tomcat的WebSocket转帖 + 自己理解
网址:http://redstarofsleep.iteye.com/blog/1488639 原帖时间是2012-5-8,自己书写时间是2013年6月21日10:39:06 Java代码 packa ...
- 解决mongodb ISODate相差8小时问题
服务端使用mongoose操作mongodb,其中Schema中的日期字段定义如下: date: {type:Date, default:Date.now},//操作日期 插入到mongodb中adt ...
- latch:library cache
一:硬解析造成的shared pool latch 争用: 每一个sql被执行之前,先要到library cache中根据hash_value查找parent cursor,这就需要先获得librar ...
- ebtablesBridge
ebtables和iptables类似,都是Linux系统下网络数据包过滤的配置工具.既然称之为配置工具,就是说过滤功能是由内核底层提供支持的,这两个工具只是负责制定过滤的rules. ebtable ...
- gem安装时出现 undefined method `size' for nil:NilClass (NoMethodError) 的解决办法
终端输入gem env 得到gem的PATH路径,比如 - GEM PATHS: - /usr/local/ruby/lib/ruby/gems/2.1.0 - /home/vagrant/.gem/ ...
- web前端面试试题总结---css篇
CSS 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有两种, IE 盒子模型.W3C 盒子模型: (2)盒模型: 内容(content).填充(padding).边界(m ...
- 深入理解ob_flush和flush的区别(转)
ob_flush/flush在手册中的描述, 都是刷新输出缓冲区, 并且还需要配套使用, 所以会导致很多人迷惑… 其实, 他们俩的操作对象不同, 有些情况下, flush根本不做什么事情.. ob_* ...
- java socker编程
转自http://haohaoxuexi.iteye.com/blog/1979837 对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户 ...
- 小学生之Java中迭代器实现的原理
一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();wh ...