求值2(组合数平方和)

博客内容讲述了如何计算组合数平方和的问题,给出了一个代码片段,通过遍历组合数并求平方和,最后使用鲁卡斯定理进行优化。输入一个整数n,输出特定条件下Ans的值,例如当n=3时,Ans=28,且n的范围不超过10^6。

题目描述 
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 <bits/stdc++.h>

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);
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值