记录编号 456207 评测结果 AAAAAAAAAA
题目名称 [HZOI 2016]艾米利亚的魔法 最终得分 100
用户昵称 Gravatarxyz117 是否通过 通过
代码语言 C++ 运行时间 10.941 s
提交时间 2017-10-04 11:07:26 内存使用 12.13 MiB
显示代码纯文本
#pragma GCC optimize("O3")
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define mod 54184622
#define MOD 27092310
#define LL long long
template<typename __>
inline void read(__ &s)
{
    s=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')
        ch=getchar();
    while(ch>='0'&&ch<='9')
        s=s*10+ch-'0',ch=getchar();
}
int N,G;
namespace solveB
{
    #define maxn 129020
    LL fac[6][maxn],inv[6][maxn];
    LL module[6]={27092310,2,3,5,7,129011};
    inline LL qpow(LL x,LL y,LL modu)
    {
        LL ans=1;
        for(;y;y>>=1,x=x*x%modu)
            if(y&1)
                ans=ans*x%modu;
        return ans;
    }
    void init(int x,int cnt)
    {
        fac[cnt][0]=fac[cnt][1]=1;
        for(int i=2;i<x;i++)
            fac[cnt][i]=fac[cnt][i-1]*i%x;
        inv[cnt][0]=inv[cnt][1]=1;
        for(int i=2;i<x;i++)
            inv[cnt][i]=(x-x/i)*inv[cnt][x%i]%x;
        for(int i=1;i<x;i++)
            inv[cnt][i]=inv[cnt][i-1]*inv[cnt][i]%x;
    }
    inline LL C(LL n,LL m,int cnt)
    {
        if(n<m)
            return 0;
        return (fac[cnt][n]*inv[cnt][m]%module[cnt]*inv[cnt][n-m])%module[cnt];
    }
    inline LL lucas(int n,int m,int cnt)
    {
        if(n<m)
            return 0;
        LL ans=1;
        LL p1=module[0],p2=module[cnt];
        for(;m;m/=module[cnt],n/=module[cnt])
            ans=ans*C(n%p2,m%p2,cnt)%p2;
        return ans*(p1/p2)%p1*qpow(p1/p2,p2-2,p2)%p1;
    }
    inline LL combin(int n,int m)
    {
        LL ans=0;
        for(int i=1;i<=5;i++)
            ans=(ans+lucas(n,m,i))%module[0];
        return ans;
    }
    void solve()
    {
        for(int i=1;i<=5;i++)
            init(module[i],i);
    }
}
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    freopen("aimiliyademagic.in","r",stdin);
    freopen("aimiliyademagic.out","w",stdout);
    read(N);
    read(G);
    LL ans=0;
    solveB::solve();
    for(int i=1;i*2<=N;i++)
        if(gcd((int)N,i)==1)
        {
            ans+=solveB::combin(G,i);
            if(ans>=MOD)
                ans-=MOD;
            ans+=solveB::combin(G,N-i);
            if(ans>=MOD)
                ans-=MOD;
        }
    LL sum=0;
    sum=solveB::qpow(N,ans,mod);
    sum=sum*solveB::qpow(N,27092310,mod)%mod;
    printf("%lld",sum);
}