CF1359E Modular Stability(思维+逆元)

首先想到如果将mod的顺序变化了一下,如果答案肯定不变,那么所有数必须要是最小的数的倍数。并且题目已知数列递增。

这是因为如果模数没有倍数关系,这就会破坏模的数据,可以通过在纸上举例子得出

因此本题答案只跟最小的数有关,枚举最小的数,之后就是在倍数中取k-1个,根据逆元组合数预处理得解

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e5+10;
const int mod=998244353;
int n,k;
ll infact[N];
ll fact[N];
ll qmi(ll a,ll b){
    ll res=1;
    while(b){
        if(b&1){
            res=res*a%mod;
        }
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
void init(){
    int i;
    fact[1]=fact[0]=1;
    for(i=2;i<=n;i++){
        fact[i]=fact[i-1]*i%mod;
    }
    infact[1]=1;
    infact[0]=1;
    for(i=2;i<=n;i++){
        infact[i]=infact[i-1]*qmi(i,mod-2)%mod;
    }
}
int main(){
    cin>>n>>k;
    init();
    int i;
    ll res=0;
    for(i=1;i<=n;i++){
        if(n/i-1<k-1)
            break;
        res=(res+(ll)fact[n/i-1]*infact[k-1]%mod*infact[n/i-k]%mod)%mod;
    }
    cout<<res<<endl;
}
View Code

 

posted @ 2020-07-01 14:38  朝暮不思  阅读(169)  评论(0编辑  收藏  举报