题目链接
题目大意
让你设计出长为k,且1<=a[i]<=n,且数组严格单调上升。使任意正整数x使其以任意顺序mod数组的所有元素值都相等
题目思路
感觉比较好想,当a1为一个数d,其他数都为d的倍数的时候,无论怎么交换,答案都是n%d.
注意求inv的时候没必要每一个都求逆元,可以求一个,然后其他的递推
代码
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=5e5+5,mod=998244353;
typedef long long ll;
int n,k;
ll a[maxn],inv[maxn],ans;
ll qpow(ll a,ll b){
ll ans=1,base=a;
while(b){
if(b&1){
ans=ans*base%mod;
}
base=base*base%mod;
b=b>>1;
}
return ans;
}
void init(){
a[0]=1;
for(int i=1;i<=5e5;i++){
a[i]=(a[i-1]*i)%mod;
}
inv[500000]=qpow(a[500000],mod-2);
for(int i=5e5-1;i>=0;i--){//这里的i要到0因为可能取到inv[0];
inv[i]=inv[i+1]*(i+1)%mod;
}
}
ll getc(ll x,ll y){//c(x,y)
return a[x]*inv[y]%mod*inv[x-y]%mod;
}
int main(){
init();
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++){//枚举第一位
if(n/i>=k){
ans=(ans+getc(n/i-1,k-1))%mod;
}else{
break;
}
}
printf("%lld\n",ans);
return 0;
}