題目:click
題意:問有多少組a[1],a[2]…a[k]對於任意x(x是非負整數),該式,任意排列a[1]…a[k],該式值不變,1<=a[i]<=n。
首先可以確定值肯定在最小的那個a[i]中,以此爲突破口進行分析,要使得全排列該式值都不變。
,mod 最小值時沒問題,mod另一個的時,需要保證y不變,那麼其他必定是的倍數。
即總式子。
#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;
}