soj4076 母函数应用

链接:soj

先附个代码:


#include <stdio.h>
#include <string.h>
#include <ctype.h>

typedef __int64 ll ;
const ll mod = 1000000007 ;
int a[7] ;

inline bool get(int &t)
{
    bool flag = 0 ;
    char c;
    while(!isdigit(c = getchar())&&c!='-') if( c == -1 ) break ;
    if( c == -1 ) return 0 ;
    if(c=='-') flag = 1 , t = 0 ;
    else t = c ^ 48;
    while(isdigit(c = getchar()))    t = (t << 1) + (t << 3) + (c ^ 48) ;
    if(flag) t = -t ;
    return 1 ;
}

inline ll C(ll n)  {   return n < 0 ? 0 : ((n+3)*(n+2)*(n+1)/6)%mod;   }

inline ll f(ll t)
{
    if( t < 0 ) return 0 ;
    ll ans = C(t) , i ;
    for( i = 4 ; i < 7 ; i++) ans -= C(t-1-a[i]);
    ans += C(t-2-a[4]-a[5]) + C(t-2-a[4]-a[6]) + C(t-2-a[5]-a[6]) ;
    ans %= mod ;
    //printf("ans: %lld\n",ans);
    return (ans+mod)%mod ;
}

inline ll CC(ll n)    {    return n < 0 ? 0 : (n+2)*(n+1)/2 % mod ;    }

inline ll func(ll t)
{
    if( t < 0 || t > a[1]+a[2]+a[3] ) return 0 ;
    ll ans = CC(t) , i ;
    for( i = 1 ; i < 4 ; i++) ans -= CC(t-1-a[i]);
    ans += CC(t-2-a[1]-a[2]) + CC(t-2-a[2]-a[3]) + CC(t-2-a[1]-a[3]) ;
    ans %= mod ;
    //printf("ansCC: %I64d\n",ans);
    return (ans+mod)%mod ;
}

inline void solve()
{
    ll k = ( a[4] + a[5] + a[6] ) , i , ans , sum = (a[1]+a[2]+a[3]) ;
	ll fk = f(k) ;
    for( i = ans = 0 ; i * 100 <= k && i <= sum ; i++) 
	{
		ans = (ans+func(i)*(fk-f(i*100-1)))%mod ;
	}
    ans = (ans+mod) % mod ;
    printf("%I64d\n",ans);
}

int main()
{
    int i , t ;
    get(t) ;
    while(t--)
    {
        for( i = 1 ; i <= 6 ; i++) get(a[i]);
        solve();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值