从这个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的更多相关文章

  1. 【BZOJ】3737: [Pa2013]Euler

    题意: 求满足\(phi(a)=n\)的\(a\)的个数.(\(n \le 10^{10}\)) 分析 这种题一开始就感觉是搜索= = 题解 首先容易得到 \[\phi(n) = \prod_{i} ...

  2. bzoj 3837 pa2013 Filary

    bzoj 先搞第一问.考虑简单情况,如果\(m=2\),那么一定有个剩余类大小\(\ge \lceil\frac{n}{2}\rceil\),同时这也是答案下界 然后我们每次随机选出一个数\(a_i\ ...

  3. BZOJ 3736: [Pa2013]Karty

    Description 一个0/1矩阵,求能覆盖所有 \(1\) ,同时不覆盖所有 \(0\) 的矩阵,使这个面积最大. Sol DP/悬线法. 首先,所求的矩阵一定可以覆盖所有贴边的悬线. 用悬线法 ...

  4. BZOJ3737 : [Pa2013]Euler

    首先枚举$n$的每个约数$d$,检查一下$d+1$是否是质数,这些数都有可能作为答案的质因子出现. 考虑爆搜,每次枚举下一个要在答案中出现的质因子$p$,将$n$除以$p-1$,再枚举$p$的指数,然 ...

  5. BZOJ 3733 [Pa2013]Iloczyn 模拟爆搜

    Description 给定正整数n和k,问能否将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示测试组数 接下来T行每行两个数n(n<=10^9),k(k& ...

  6. bzoj 3733: [Pa2013]Iloczyn【dfs】

    参考:http://www.cnblogs.com/clrs97/p/5125976.html 瞎搞约数失败...滚去搜索 dfs(x,y,z) 表示当前可选第x到第m个约数,还要选y个约数,已有z的 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法

    给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sampl ...

  9. bzoj 2820 YY的GCD - 莫比乌斯反演 - 线性筛

    Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必 ...

随机推荐

  1. Python展开一个嵌套的序列

    摘自<Python Cookbook> 4.6 任务 序列中的子序列可能是序列,子序列的子项仍有可能是序列,以此类推,则序列嵌套可以达到任意的深度.需要循环遍历一个序列,将其所有的子序列展 ...

  2. Sample RWD Setup for Client-Side Development

    RWD and RESS concepts fluid images, responsive grids, and media queries. Twitter's Bootstrap based o ...

  3. Android Service 简介

    Service是Android系统中的一种组件,它跟Activity的级别差不多,但是它不能自己运行,只能后台运行,并且可以和其他组件进行交互.Service是没有界面的长生命周期的代码.Servic ...

  4. 反汇编动态追踪工具Ollydbg. ALD,ddd,dbg,edb...

    Ollydbg 通常称作OD,是反汇编工作的常用工具,吾爱破解OD附带了118脱壳脚本和各种插件,功能非常强大,基本上不需要再附加安装其它插件了. 对OD的窗口签名进行了更改,从而避免被针对性检测 修 ...

  5. y combinator 做的一个调查_可以学习一下

    RoR: 在网络营运平台企业中,RoR站稳使用率第一的位置.其用户包括:ZenPayroll (人力资源).Asile50 (零售平台).BackerKit (众筹平台).Rainforest (QA ...

  6. cholesky分解

        接着LU分解继续往下,就会发展出很多相关但是并不完全一样的矩阵分解,最后对于对称正定矩阵,我们则可以给出非常有用的cholesky分解.这些分解的来源就在于矩阵本身存在的特殊的 结构.对于矩阵 ...

  7. Intellij IDEA 14隐藏被排除的文件夹

    被排除的文件和文件夹以红色显示了. 看着这东西,人一下子就不好了. 还好设置可以改回来. Project tab右上角齿轮,关闭“Show Excluded Files”即可.

  8. [置顶] 【Git入门之九】解决冲突

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309531 1.多人协作冲突 如果多人同时修改了同一个文件,那会出现什么样 ...

  9. linux/hpux 添加用户

    #添加用户组, 组名dev, 组id为1001groupadd -g 1001 dev #添加用户组dev,不指定组idgroupadd dev #添加用户user1, id为111, 属于dev组, ...

  10. javascript 判断是否是数组

    function isArray(object){ return object && typeof object==='object' && typeof object ...