シーケンスのGCD

タイトル効果:
Bが要件満たすように構成された、長さのシーケンスnおよび範囲[1、M]が与えられると、\(B_i \) [M、1]に属すると\(B_i = a_iを\!)の関係を正確にK
無用のMo抗行う
非常に複雑な考え始めるが、その後私は複数に変更し、I BEG答えを見つける請うないことが判明
だけではI = GCDを見つけることは非常に困難であることが、上の代わりに、私倍数の場合それだけにかかわらず、私は倍数でない数の選択することができます。
Kが順序を変えるチャンスを持っている番号iの倍数でない場合、我々はそれ以外の変更を変更することはできません、彼にチャンスを与える必要があります。
そして、それは柿ことは明らかです。

    #include<cstdio>
#include<iostream>
using namespace std;
const int N=3e5+7,maxn=3e5,mod=1e9+7;
inline int read() {
    int x=0;char c=getchar();
    for(;c<'0'||c>'9';c=getchar());
    for(;c>='0'&&c<='9';c=getchar()) x=x*10+c-48;
    return x;
}
int js[N],inv[N],c[N],f[N],g[N];
inline int C(int n,int m) {
    if(m<0||m>n) return 0;
    return 1ll*js[n]*inv[m]%mod*inv[n-m]%mod;
}
inline int qpow(int a,int b,int c=1) {
    for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) c=1ll*c*a%mod;
    return c;
}
inline void moded(int &x) {
    if(x>=mod) x-=mod;if(x<0) x+=mod;
}
signed main() {
    js[0]=inv[0]=1;
    for(int i=1;i<=maxn;++i) js[i]=1ll*js[i-1]*i%mod;
    inv[maxn]=qpow(js[maxn],mod-2);
    for(int i=maxn-1;i;--i) inv[i]=1ll*inv[i+1]*(i+1)%mod;
    int n,m,k;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF) {
        for(int i=1;i<=m;++i) c[i]=0;
        for(int i=1;i<=n;++i) c[read()]++;
        for(int i=m;i;--i) {
            int tt=0;
            for(int j=1;i*j<=m;++j) tt+=c[i*j];f[i]=0;
            if(n-tt>k) continue;
            f[i]=1ll*C(tt,k-(n-tt))*qpow(m/i-1,k-(n-tt))%mod*qpow(m/i,n-tt)%mod;
        }
        for(int i=m;i;--i) for(int j=2;j*i<=m;++j) moded(f[i]=f[i]-f[i*j]);
        for(int i=1;i<=m;++i) printf("%d ",f[i]);
        puts("");
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/hzoi-kx/p/12120942.html