求值2(组合数平方和)
发布日期:2021-09-19 10:55:51 浏览次数:1 分类:技术文章

本文共 1041 字,大约阅读时间需要 3 分钟。

题目描述 

Ans = 0; 
For(inti = 1; i <= n; i++) 
    For(int v = 0; v <= n; v++) 
        Ans = (Ans + C(i, v) * C(i, v)) % 998244353;
C(i,v)为组合数第i行第v列的数。
给你上面的代码中的n,请你输出Ans的值。
输入描述:
输入一个整数n
输出描述:
输出Ans的值。
示例1
输入
复制
3
输出
复制
28
备注:

n<=106

思路:

这个题是所有组合数的平方和是概率课本上的一道公式。

直接用鲁卡斯定理求就行。

代码:

#include 
using namespace std;const long long mod=998244353;const int maxn=2000010;long long F[maxn];void init(long long p){ F[0] = 1; for(int i = 1;i <= p;i++) F[i] = F[i-1]*i%mod;}long long inv(long long a,long long m){ if(a == 1)return 1; return inv(m%a,m)*(m-m/a)%m;}long long Lucas(long long n,long long m,long long p){ long long ans = 1; while(n&&m) { long long a = n%p; long long b = m%p; if(a < b)return 0; ans = ans*F[a]%p*inv(F[b]*F[a-b]%p,p)%p; n /= p; m /= p; } return ans;}//int main(){ long long n; cin>>n; init(2*n); long long sum=0; for(int i=1;i<=n;i++) { sum=(sum+Lucas(2*i,i,mod))%mod; } printf("%lld\n",sum);}

转载地址:https://blog.csdn.net/a1046765624/article/details/80663479 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:走格子(简单dfs)
下一篇:托米去购物(最大权闭合子图模型-最小割最大流)

发表评论

最新留言

不错!
[***.144.177.141]2024年04月21日 13时31分59秒