牛客白月赛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


di
表示的是 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题解的主要内容,如果未能解决你的问题,请参考以下文章

牛客白月赛4 题解

牛客白月赛11题解

牛客白月赛12题解

牛客白月赛10题解

牛客白月赛32题解

牛客白月赛31题解