NC16543. 求值2
描述
Ans = 0;C(i,v)为组合数第i行第v列的数。
For(inti = 1; i <= n; i++)
For(int v = 0; v <= n; v++)
Ans = (Ans + C(i, v) * C(i, v)) % 998244353;
输入描述
输入一个整数n
输出描述
输出Ans的值。
示例1
输入:
3
输出:
28
C++11(clang++ 3.9) 解法, 执行用时: 37ms, 内存消耗: 24040K, 提交时间: 2018-06-08 20:09:47
#include<bits/stdc++.h> using namespace std; long long fac[2000010]; long long inv[1000010]; const long long mod=998244353; int main(){ fac[0]=1; for(int i=1;i<=2000000;i++)fac[i]=fac[i-1]*i%mod; inv[1000000]=490058372; for(int i=1000000;i>1;i--)inv[i-1]=inv[i]*i%mod; long long ans=0; int n; cin>>n; for(int i=1;i<=n;i++)ans=(ans+fac[i*2]*inv[i]%mod*inv[i]%mod)%mod; cout<<ans<<endl; }
C++14(g++5.4) 解法, 执行用时: 331ms, 内存消耗: 13292K, 提交时间: 2018-06-11 10:52:09
#include<stdio.h> #define MD 998244353 int INV(int x) { return x==1?x:1LL*(MD-MD/x)*INV(MD%x)%MD; } int f[2234567],ans[2234567],t,n; int main() { f[1]=1; for(int i=2;i<2234567;i++)f[i]=f[i-1]*1LL*i%MD; for(int i=1;i<1034567;i++)t=INV(f[i]),ans[i]=(ans[i-1]+f[2*i]*1LL*t%MD*t%MD)%MD; scanf("%d",&n),printf("%d",ans[n]); return 0; }