hdu-5490

1.横向和纵向可以分开来考虑

2.对于等差数列来说,直接跑一个10^4的递推求和 , g(n,m)= a1*C(m-1,m+n-2) + a2*C(m-1,m+n-3) +a3*C(m-1,m+n-4) + ..... + an*C(m-1,m-1)

3.对于等比数列来说 S(n,m) =  ( q * S(n-1,m) - C(n,m+n-1) ) / ( q - 1 )  , S(0,m) = (q^(m+1) -1) / (q-1) , f(n,m) = b1 * S(n-1,m-1)

4. 总的和为 g(n,m) + f(n,m)

下为代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
#include<iostream>
#include<set>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a))
const int INF=~(1<<(sizeof(int )*8-1))-100000;
typedef long long ll;
typedef pair<int,int > P;
#define MOD 1000000007

ll gcd(ll a,ll b, ll& d, ll &x, ll &y)
{
    if(!b) {d=a;x=1;y=0;}
    else {  gcd(b,a%b,d,y,x); y-=x*(a/b); }
}
ll inv(ll a,ll n)
{
    ll d,x,y;
    gcd(a,n,d,x,y);
    return d=1?(x+n)%n:-1;
}

ll pow_mod(ll x,ll n)
{
    ll ret=1;
    while(n>0)
    {
        if(n&1)
        {
            ret*=x;
            ret%=MOD;
        }
        x*=x;
        x%=MOD;
        n>>=1;
    }
    return ret;
}

int T;
ll b1,q,a1,d,n,m;
int main()
{
    //freopen("in","r",stdin);
    scanf("%d",&T);
    int cas=0;
    while(T--)
    {
        cas++;
        scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&b1,&q,&a1,&d,&n,&m);
        ll ans=0;
        ll c=1;
        ll y=(a1+(n-1)*d%MOD)%MOD;
        for(int i=1;i<=n;i++)
        {

            ans+=y*c%MOD;
            ans%=MOD;
            y=((y-d)%MOD+MOD)%MOD;
            c=c*(m-1+i)%MOD*inv(i,MOD)%MOD;
        }
        ll temp=0;
        ll u=inv(q-1,MOD);
        ll s=((pow_mod(q,m)-1+MOD)%MOD+MOD)%MOD*u%MOD;
        c=m;
        for(int i=1;i<n;i++)
        {
            s=((s*q-c)%MOD+MOD)%MOD*u%MOD;
            c=c*(m+i)%MOD*inv(i+1,MOD)%MOD;
        }
        ans=(ans+s*b1)%MOD;
        printf("Case #%d: %I64d\n",cas,ans);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值