• 一本通1624樱花(数学+唯一分解定理)


    #10202. 「一本通 6.2 练习 5」樱花

    题意很简单,就是求给你的那个式子中(x,y)的解得数量。

    但是做起来没那么容易了,基本思路是这样的:

    需要想办法对式子进行整理,进而得到可以解决问题的式子。

    首先把原式进行通分,得到

    进行十字相乘,得到 n!(x+y)=xy ;

    移项,得n!(x+y)-xy=0;

    两边同时加上(n!)2,得到(n!)2-n!(x+y)-xy=(n!)2

    对其进行因式分解,得到(n!-x)(n!-y)=(n!)2

    令a=(n!-x),b=(n!-y),式子变为 ab=(n!)2

    要求组合(x,y)的种数,即变成了求(n!)的因子a的种数,(n!是确定的,那么知道了a的种类数,就知道了b的种类数),

    (n!)2 的因子想到唯一分解定理:n!=p1a1+p2a2+......+pnan ;那么(n!)2=ab=p12a1+p22a2+......+pn2an 

    唯一分解定理中关于因子的个数有cnt=(2×a1+1)×(2×a2+1)×...×(2×an+1) ;

    问题最后就转化成了求(n!)2的因子的个数。

    因为pn为质数,如果暴力求肯定会超时,所以需要素数筛来解决。

    因为n!的每个质因子都不超过n,所以我们可以打表预处理1n内所有质数p,再考虑n!内一共有多少个质因子p。

    唯一分解定理讲解:唯一分解定理

    素数筛讲解:素数筛法讲解 

    代码如下:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 typedef long long ll;
     6 const ll mod=1e9+7;
     7 const int maxn=1e6+7;
     8 int prime[maxn];
     9 bool isp[maxn];
    10 int cnt;
    11 void makeprime()//预处理素数表 
    12 {
    13     cnt=0;
    14     memset(isp,true,sizeof(isp));
    15     for(int i=2;i<=maxn;i++)
    16     {
    17         if(isp[i])
    18         {
    19         prime[++cnt]=i;
    20         }
    21         for(int j=1;j<=cnt;j++)
    22         {
    23             if(i*prime[j]>maxn)
    24             break;
    25             isp[i*prime[j]]=false;
    26             if(i%prime[j]==0)
    27             break;
    28         }
    29     }
    30     return ;
    31 }
    32 int num[maxn];//用来记录1-n!中每个素数出现的次数 
    33 void makenum(int x)//得到次1-n!中每个素数出现的次数
    34 {
    35     for(int i=1;prime[i]*prime[i]<=x;i++)
    36     {
    37         if(x%prime[i]==0)
    38         {
    39             while(x%prime[i]==0)
    40             {
    41                 num[prime[i]]++;
    42                 x/=prime[i];
    43             }
    44         }
    45     }
    46     if(x>1)
    47     num[x]++;
    48 }
    49 int main()
    50 {
    51     ll n;
    52     cin>>n;
    53     memset(num,0,sizeof(num));
    54     makeprime();
    55     for(int i=1;i<=n;i++)//这里每一个都要处理,因为是n!不是一个数n 
    56     {
    57         makenum(i);
    58     }
    59     ll ans=1;
    60     for(int i=1;i<=n;i++)//唯一分解定理的结论 
    61     {
    62         ans=ans*((ll)num[i]*2+1)%mod;
    63     }
    64     printf("%lld",ans);
    65     return 0;
    66 }
  • 相关阅读:
    New Audio Codec (3) : Design of a Scalable Parametric Audio Coder(可分级正弦模型)
    英国旅游庄园酒店
    圣塔芭芭拉加州大学 信号压缩实验室
    mptkcodec工程(二):VS2008+Win7 编译 mptkcodec(下)
    SPIHT 编码原理,代码,应用,专利问题
    Audio Bandwidth Extension 技术主页
    【quote】free HRTF Databases available online
    New Audio Codec (4) : Daryl Ning 的 Warped LPC and Wavelet Audio Coding 方案
    mptkcodec工程(二):VS2008+Win7 编译 mptkcodec(上)
    mptkcodec工程(一):Cygwin+Win7 编译 mptkcodec
  • 原文地址:https://www.cnblogs.com/theshorekind/p/12751153.html
Copyright © 2020-2023  润新知