Codeforces Global Round 21 E. Placing Jinas

本文介绍了如何利用组合数和快速幂解决动态规划问题,特别是针对E.Placing Jinas这一题目,通过观察发现每行最后一个元素的累加和特性,实现了O(N)的时间复杂度解决方案。文章还提供了C++代码实现,涉及快速幂计算逆元和组合数的方法,对于理解动态规划和高效算法设计具有参考价值。
摘要由CSDN通过智能技术生成

Problem - E - Codeforces (Unofficial mirror by Menci)

 E. Placing Jinas

        题目大意:每个点相当于(0,0)到每个点(只能向下和向右走)的方法数量

每行的白方块从左到右一共有a[ i ]个,问白方格里的总和是多少

111111
123456
136101521
1410203556
15153570126
162156126252

         可以发现这是类似组合数的表,C(i,j)是每个格子的大小,很容易想到全遍历一遍,但是这样显然太慢

        所以观察发现每一行最后一个(i,a[i])的累加和为C(i+1,a[i]),O(N)就可以算完

        用到快速幂求逆元和组合数

        代码

#include<bits/stdc++.h>
#define debug0(x) cout << "debug0: " << x << endl
#define fr(t, i, n) for (int i = t; i < n; i++)
#define first fi
#define second se
using namespace std;

typedef long long LL;
typedef pair<int,int> PII;

LL qmi(LL a,int b,int p)//快速幂在于思想
{
    LL res=1;
    while(b)//对b进行二进制化,从低位到高位
    {
        if(b&1) res = res *a %p;
        b>>=1;
        a=a*a%p;
    }
    return res % p;
}

const int N = 5e5+10,mod = 1e9+7;
LL fact[N];//,inv[N];
void solve(){
	int n;cin >> n;
    
    fact[0] /*= inv[0]*/ = 1;
    
    for(int i = 1;i < N;i ++)fact[i] = fact[i-1]*i%mod;
    //inv[N-1]=qmi(fact[N-1],mod-2,mod); for(int i=N-2;i>=1;i--) inv[i]=inv[i+1]*(i+1)%mod;

    //for(int i = 0;i < N;i ++)assert(inv[i] == qmi(fact[i],mod-2,mod));

    LL ans = 0;
    fr(0,i,n+1){
        int a;cin >> a;
        if(a < 1)continue;
        ans = (ans + (fact[a+i]*qmi(fact[i+1],mod-2,mod)%mod)*qmi(fact[a-1]%mod,mod-2,mod)%mod)%mod;
        //ans = (ans + (fact[a+i]*inv[i+1]%mod)*inv[a-1]%mod)%mod;
    }

    cout << ans << endl;
    
}

int main()
{
	/*
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	*/
	int T = 1;
	
	while(T--){
		solve();
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值