zoukankan      html  css  js  c++  java
  • Codeforces 223C Partial Sums 数论+组合数学

    题意非常easy,求不是那么好求的,k非常大 要操作非常多次,所以不可能直接来的。印象中解决操作比較多无非线段树 循环节 矩阵 组合数等等吧,这道题目 也就仅仅能多画画什么 的了 

    就以第一个案例为主吧 。

    1 2 3

    k我们根据画的次数来自己定好了

    以下的每一个数表示这个位置的 数由最初的 数组num[]中多少个数加起来得到的

    当k为0的时候呢。就是

    1 1 1

    k为1的时候呢

    1 2 3

    k为2的时候呢

    1 3 6

    那么k为3的时候

    1 4 10

    这里看一下 从数组下标0開始。那么事实上就是 C(i + k,i)

    认为不够的话呢 能够再多写几个,发现就是这么回事啊 。跟组合数有联系了,那么肯定不可能每一次都求啊 ,所以能够试着搞一个矩阵,这样就能够做了

    做的时候组合数直接来超时了,能够先用一个c数组预处理出全部的组合数答案,求答案运用C(n,m) == C(n,n - m)这样省时间这样也是700+ms比較慢,当然若是再把乘法逆元给 先预处理存到数组里会更加省时间 并且会省非常多。


    #include<iostream>
    #include<cstdio>
    #include<list>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<stack>
    #include<map>
    #include<vector>
    #include<cmath>
    #include<memory.h>
    #include<set>
    
    #define ll long long
    
    #define eps 1e-8
    
    const int inf = 0xfffffff;
    
    const ll INF = 1ll<<61;
    
    using namespace std;
    
    //vector<pair<int,int> > G;
    //typedef pair<int,int > P;
    //vector<pair<int,int> > ::iterator iter;
    //
    //map<ll,int >mp;
    //map<ll,int >::iterator p;
    
    #define MOD 1000000007
    
    ll num[2000 + 5];
    
    int n,k;
    
    ll exgcd(ll a, ll b, ll &x, ll &y)  {
    	if(!b) {
    		x = 1; y = 0;
    		return a;
    	}
    	ll r = exgcd(b, a%b, y, x);
    	y -= a/b*x;
    	return r;
    }
    
    ll inv(ll a, ll m)
    {
    	ll x,y,gcd = exgcd(a, m, x, y);
    	if(x < 0)  
    		x += m;
    	return x;
    }
    
    ll C(ll n,ll m) {
    	ll ans = 1;
    	for(int i=1;i<=m;i++)
    		ans = ((ans * inv(i,MOD))%MOD * (n - i + 1))%MOD;
    	return ans;
    }
    
    ll c[2000 + 5];
    
    int main() {
    	while(scanf("%d %d",&n,&k) == 2) {
    		for(int i=0;i<n;i++)
    			scanf("%d",&num[i]);
    		if(k == 0) {
    			for(int i=0;i<n;i++)
    				printf("%I64d%c",num[i],i == n - 1?

    ' ':' '); continue; } for(int i=0;i<n;i++) c[i] = C(i + k - 1,i); for(int i=0;i<n;i++) { ll ans = 0ll; for(int j=0;j<=i;j++) { //ll tmp = C(i - j + k - 1,i - j); //ll tt = num[j]; ans = (ans + num[j] * c[i - j])%MOD; } printf("%I64d%c",ans,i == n - 1?

    ' ':' '); } } return 0; }





  • 相关阅读:
    推荐一个wpf&sliverlight的图表控件
    数独求解
    WPF中的 CollectionChanged事件通知
    Windows 7 任务栏之缩略图预览(Thumbnail)
    把Google HK设为IE默认的搜索引擎
    F#小记——1. Hello F#
    F#小记——2. 基本数据类型
    使用异步socket的时候需要注意memory spike
    《everytime you kissed me》的中文歌词
    我回来了o(∩_∩)o...
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7243734.html
Copyright © 2011-2022 走看看