版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}