牛客白月赛14题解
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客白月赛14题解相关的知识,希望对你有一定的参考价值。
https://ac.nowcoder.com/acm/contest/879
目录
投硬币【组合数】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5+10;
const int mod=998244353;
LL f[N],inf[N],val1[N],val2[N],n,k,p;
LL qsm(LL a,LL b,LL p)
LL sum=1;
while(b)
if(b&1) sum=sum*a%p;
b>>=1;
a=a*a%p;
return sum%p;
void init()
f[0]=1,inf[0]=1;
for(int i=1;i<=n;i++)
f[i]=f[i-1]*i%mod;
inf[i]=inf[i-1]*qsm(i,mod-2,mod)%mod;
val1[0]=1,val2[0]=1;
for(int i=1;i<=n;i++)
val1[i]=val1[i-1]*p%mod;
val2[i]=val2[i-1]*(1-p+mod)%mod;
LL solve(LL n,LL k)
LL sum=1;
if(n<k) return 0;
sum=(sum*f[n])%mod;
sum=(sum*inf[n-k])%mod;
sum=(sum*inf[k])%mod;
sum=(sum*val1[k])%mod;
sum=(sum*val2[n-k])%mod;
return sum%mod;
int main(void)
cin>>n>>k>>p;
LL ans=0;
init();
for(int i=k;i<=n;i++) ans=(ans+solve(n,i))%mod;
cout<<ans;
return 0;
植树造林
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,k;
int main(void)
cin>>n;
if(n&1) puts("1");
else puts("2");
return 0;
签到题I
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,k;
int main(void)
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
cout<<a[k-1];
return 0;
many sum
∑d∣i
表示的是 i的所有的因子的和 。 d | i 表示 i%d==0
可以用类似于埃式筛法那样。时间复杂度O(nlogn)
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e6*2+10;
LL a[N],b[N],n,m,sum;
int main(void)
cin>>n>>a[1]>>m;
for(int i=2;i<=n;i++) a[i]=(a[i-1]+i*7)%m;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j+=i)
b[j]=b[j]+a[i];
for(int i=1;i<=n;i++) sum^=b[i];
cout<<sum;
return 0;
有毒的玻璃球【积性函数】
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e7+10;
const int mod=1e9+7;
LL f[N],n,k;
int prime[N],st[N],cnt;
LL qsm(LL a,LL b,LL p)
LL sum=1;
while(b)
if(b&1) sum=sum*a%p;
b>>=1;
a=a*a%p;
return sum%p;
void init()
f[1]=1;
for(int i=2;i<=n;i++)
if(!st[i]) prime[cnt++]=i,f[i]=qsm(i,k,mod);
for(int j=0;prime[j]<=n/i;j++)
st[i*prime[j]]=1;
f[i*prime[j]]=(f[i]*f[prime[j]])%mod;
if(i%prime[j]==0) break;
int main(void)
cin>>n>>k;
init();
LL ans=0;
for(int i=1;i<=n;i++) ans=(ans+n/i*f[i])%mod;// n/i 表示 1-n中是i的倍数的数有 n/i个
cout<<ans<<endl;
return 0;
以上是关于牛客白月赛14题解的主要内容,如果未能解决你的问题,请参考以下文章