HDU 5407 CRB and Candies(LCM +最大素因子求逆元)

Posted jzssuanfa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 5407 CRB and Candies(LCM +最大素因子求逆元)相关的知识,希望对你有一定的参考价值。

【题目链接】click here~~

【题目大意】求LCM(Cn0,Cn1,Cn2....Cnn)%MOD 的值

【思路】来图更直观:

技术分享


这个究竟是怎样推出的,说实话。本人数学归纳大法没有推出来,幸得一个大神给定愿文具体证明,点击这里:click here~~

代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
const int MOD=1e9+7;
typedef long long LL;
LL p[N];
LL arr[N];
bool ok(int n) //推断n是不是仅仅有一个质因子,p[n]表示n最大的质因子。
{
    int t=p[n];
    while(n%t==0&&n>1) n/=t;
    return n==1;
}
LL poww(LL a,LL b)
{
    LL res=a,ans=1;
    while(b)
    {
        if(b&1) ans=res*ans%MOD;
        res=res*res%MOD;
        b>>=1;
    }
    return ans;
}
LL niyuan(LL a) /// 求逆元
{
    return poww(a,MOD-2);
}
inline LL read()
{
    int c=0,f=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){c=c*10+ch-‘0‘;ch=getchar();}
    return c*f;
}
void init()
{
    for(int i=1; i<N; ++i) p[i]=i;
    for(int i=2; i<N; ++i) if(p[i]==i)
    {
        for(int j=i+i; j<N; j+=i)
            p[j]=i;
    }
    arr[0]=1;
    for(int i=1; i<N; ++i)//求LCM
    {
        if(ok(i))
            arr[i]=arr[i-1]*p[i]%MOD;
        else arr[i]=arr[i-1];
    }
}
int main()
{
   init();
   int t;t=read();
   while(t--)
   {
       int n;n=read();
       LL ans=arr[n+1]*niyuan(n+1)%MOD;//由欧拉定理a^(p-1) mod p = 1 p是质数 所以a的逆元是a^{p-2}
       printf("%lld\n",ans);
   } return 0;
}






以上是关于HDU 5407 CRB and Candies(LCM +最大素因子求逆元)的主要内容,如果未能解决你的问题,请参考以下文章

转载:HDOJ 5407 CRB and Candies(求1到n的LCM 位图储存结构)

hdu5411 CRB and Puzzle

HDU - 5411 CRB and Puzzle 矩阵快速幂

HDU 5411 CRB and puzzle (Dp + 矩阵高速幂)

[HDU - 5408] CRB and Farm

hdu5406 CRB and Apple dp+两个LIS