NC203371. 圆桌聚餐
描述
输入描述
一行三个整数,n , p , q。
输出描述
一行一个整数,输出答案。可以证明答案可以表示为 ( P 和 Q 为整数且互质, )。
输出 .
示例1
输入:
5 1 0
输出:
2
说明:
答案为2.示例2
输入:
6 1 1
输出:
499122179
说明:
答案为2.5.C++14(g++5.4) 解法, 执行用时: 64ms, 内存消耗: 2912K, 提交时间: 2020-03-21 19:03:39
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod=998244353,maxn=300050; int dp[maxn],sum[maxn]; ll qpow(ll a,int n=mod-2) { ll res=1; a%=mod; while(n) { if(n&1) res=res*a%mod; a=a*a%mod; n>>=1; } return res; } int main() { int n,p,q; scanf("%d%d%d",&n,&p,&q); for(int i = 1; i <= n; sum[i]=(sum[i-1]+dp[i])%mod, dp[i]++, i++) dp[i] = ((i>5)*q*(2ll*sum[i-3]+i-5)+(i>3)*p*(2ll*sum[i-2]+i-3))%mod*qpow((i>5)*(i-5ll)*q+(i>3)*(i-3ll)*p)%mod; printf("%d\n",dp[n]); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 63ms, 内存消耗: 2784K, 提交时间: 2020-03-22 14:04:46
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=998244353,maxn=300050; int dp[maxn],sum[maxn]; ll qpow(ll a,int n=mod-2) { ll res=1; a%=mod; while(n) { if(n&1) res=res*a%mod; a=a*a%mod; n>>=1; } return res; } int main() { int n,p,q; scanf("%d%d%d",&n,&p,&q); for(int i=1;i<=n;sum[i]=(sum[i-1]+dp[i])%mod,dp[i]++,i++) dp[i]=((i>5)*q*(2ll*sum[i-3]+i-5)+(i>3)*p*(2ll*sum[i-2]+i-3))%mod*qpow((i>5)*(i-5ll)*q+(i>3)*(i-3ll)*p)%mod; printf("%d\n",dp[n]); return 0; }