您的位置:首页 > 编程语言

hdu-5490

2015-09-28 14:19 429 查看
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm hdu 数学 代码