zoukankan      html  css  js  c++  java
  • 恭介的法则

    题目:

    Description

    终于,在众亲们的奋斗下,最终boss 恭介被关进了库特设计的密室。正当她们松了一口气时,这个世界却发生了天翻覆地的变化:地面开始下沉,天空开始变成血红色,海水沸腾……一幅世界末日的图景。美鱼从她手中的古籍《若山牧水诗歌集》中发现了原因:白鸟は かなしからずや 空の青 海のあをにも 染まずただよふ 。大(xia)意(shuo)就是狡猾的恭介在创造这个世界的时候就篡改了法则。而这个法则的起源,就是一只生死之间的猫。这个猫被关在一个黑盒子里,盒子里有两个毒气罐,如果有任意一个毒气罐被打开那么猫将会被杀死,法则也能得到纠正。然而外界能控制的仅仅是这两个毒气罐被打开的概率。假设第一个毒气罐被打开的概率为1/x,第二个毒气罐为1/y(x,y 为正整数),那么当两个概率和为1/(n!)时,猫将会被莫名其妙地杀死。现在美鱼想知道,有多少对(x,y)可以让猫被莫名其妙杀死。

    Input

    一行,一个正整数n

    Output

    一行,满足题意的(x,y)对数。
     

    Sample Input

    6

    Sample Output

    135

    Data Constraint

    对于30%的数据 n<=6

    对于60%的数据 n<=50

    对于100%的数据 n<=700000
     
     

    题解:

    先来一波因式分解

    frac{1}{x}+frac{1}{y}=frac{1}{n!}

    frac{x+y}{x*y}=frac{1}{n!}

    n!(x+y)=xy

    xy-n!(x+y)=0

    xy-n!(x+y)+(n!)^{2}=(n!)^{2}

    (x-n!)(y-n!)=(n!)^{2}

     (x-n!)(y-n!)=(n!)^{2}可得 x-n! 和 y-n! 都是(n!)^{2}的约数,所以只用求出(n!)^{2}的约数个数。

    因为这题数据很大,所以要高精度压8位(这题有坑,要输前导零)。

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std;
    long long n,k=0,len,ans[700005];
    bool v[700005];
    void mul(int x)
    {
        for(int i=1;i<=len;i++)     
            ans[i]*=x;
        for(int i=1;i<=len;i++)
        {   
            ans[i+1]+=ans[i]/100000000;
            ans[i]%=100000000;
        }
        while(ans[len+1]>0)
        {
            len++;
            ans[len+1]+=ans[len]/100000000;
            ans[len]%=100000000;
        }
    }
    int main()
    {
        len=1;
        k=1;
        scanf("%lld",&n);
        ans[1]=1;
        memset(v,true,sizeof(v));
        for (int i=2;i<=n;i++)
        {
            if (v[i]==true)
            {
                int x=n,y=0;
                while(x>=i) 
                    x/=i,y+=x;
                y=y*2+1;
                   if(y*k>100000000)
                    {
                    mul(k);
                    k=1;
                }
                   k*=y;
                    for(int j=i;j<=n;j+=i) 
                        v[j]=false;
            }
        }
        if (k>1) mul(k);
        printf("%lld",ans[len]);
        for (int i=len-1;i>0;i--)
            printf("%08lld",ans[i]);
    }
  • 相关阅读:
    linux查看tomcat下记录
    jstatd error
    你不来,我不敢老去
    解决forward后资源加载失败的问题
    SSL安装 tomcat jks AVR
    浅谈Class Activation Mapping(CAM)
    oracle大牛博客
    Oracle函数translate()的用法
    oralce函数nullif使用
    总结优化索引的规则
  • 原文地址:https://www.cnblogs.com/nibabadeboke/p/11358477.html
Copyright © 2011-2022 走看看