修仙录 3.18

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41709770/article/details/88651681

想法很单纯,码量太夸张
题解和AC代码不在同一频道上
看题解打不出来,看代码无法理解
还好今天还是改了一道题的
QAQ


jzoj 6067 More?More!

https://jzoj.net/senior/#contest/show/2672/2
又是一道巧题。
在这里插入图片描述
这个是用了两种计算方法得到同一结果,得到等式,化成递推式。
人才呀

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=1e6+5;
const int mod=998244353;

int n,p;
long long f,mi[MAXN],ny[MAXN];

long long Pow(long long a,long long b){
	long long ans=1;
	a=(a+mod)%mod;
	while(b){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}

long long C(int n,int m){
	return mi[n]*ny[m]%mod*ny[n-m]%mod;
}

long long calc(int i){
	long long a=(Pow(p,n-i+1)-Pow(1-p,n-i+1)+mod)%mod;
	long long b=(Pow(p,i)-Pow(1-p,i)+mod)%mod;
	return a*Pow(b,mod-2)%mod;
}

int main(){
	freopen("more.in","r",stdin);
	freopen("more.out","w",stdout);
	cin>>n>>p;
	for(int i=1;i<=n;i++) f=(f+Pow(p,n-i)*Pow(1-p,i-1)%mod)%mod;
	mi[0]=mi[1]=1; for(int i=2;i<=n;i++) mi[i]=mi[i-1]*i%mod;
	ny[0]=ny[1]=1; for(int i=2;i<=n;i++) ny[i]=(mod-mod/i)*ny[mod%i]%mod;
	for(int i=1;i<=n;i++) ny[i]=ny[i]*ny[i-1]%mod;
	if(p==Pow(2,mod-2)) for(int i=1;i<n;i++) printf("%d ",C(n,i)*Pow(p,1ll*i*(n-i))%mod);
	else for(int i=2;i<=n;i++) printf("%d ",f),f=f*calc(i)%mod;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41709770/article/details/88651681
今日推荐