Educational Codeforces Round 88 (Rated for Div. 2)E. Modular Stability

題目:click
題意:問有多少組a[1],a[2]…a[k]對於任意x(x是非負整數),((xmod  a[1])mod  a[2]....)mod  a[k]((x\mod a[1])\mod a[2]....)\mod a[k]該式,任意排列a[1]…a[k],該式值不變,1<=a[i]<=n。
在這裏插入圖片描述
首先可以確定值肯定在最小的那個a[i]中,以此爲突破口進行分析,要使得全排列在這裏插入圖片描述該式值都不變。
x=a1k+yx=a_1*k+y,mod 最小值時沒問題,mod另一個的aia_i時,需要保證y不變,那麼其他aia_i必定是a1a_1的倍數ai=k?a1a_i=k_?*a_1
即總式子i=1nCn/i1k1\sum_{i=1}^nC_{n/i-1}^{k-1}

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define MAX_len 200005*4
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
const int mod=998244353;
ll n,k;
ll a[500100];
ll quickpow(ll a,ll nn)
{
    ll res=1;
    while(nn)
    {
        if(nn&1)
            res=(res*a)%mod;
        nn>>=1;
        a=(a*a)%mod;
    }
    return res;
}
void init()
{
    a[0]=1;
    for(ll i=1;i<=n;i++)
    {
        a[i]=(i*a[i-1])%mod;
    }
}
ll C(ll n,ll m)
{
    if(n<m)
        return 0;
    ll temp=(a[n-m]*a[m])%mod;
    ll res=(a[n]*(quickpow(temp%mod,mod-2)%mod))%mod;
    return res;
}
int main()
{
    ll i,j;
    scanf("%I64d %I64d",&n,&k);
    init();
    if(k>n)
    {
        printf("0");
        return 0;
    }
    if(k==1)
    {
        printf("%I64d",n);
        return 0;
    }
    if(n==k)
    {
        printf("1");
        return 0;
    }
    ll ans=0;
    for(i=1;i<=n;i++)
    {
        ans=(ans+C(n/i-1,k-1))%mod;
    }
    printf("%I64d",ans);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章