欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

bzoj 3208 食物(生成函数)

程序员文章站 2024-03-21 17:36:46
...

先推一下生成函数
承德汉堡:偶数个
1+x2+x4+x6+......=11x2
可乐:0个或1个
1+x=1x21x
鸡腿:0个或1个或2个
1+x+x2=1x31x
蜜桃多:奇数个
x+x3+x5+......=x1x2
鸡块:四的倍数个
1+x4+x8+x12+......=11x4
包子:0个或1个或2个或3个
1+x+x2+x3=1x41x
土豆片炒肉:不超过一个
1+x=1x21x
面包:三的倍数个
1+x3+x6+x9+......=11x3
总生成函数:
11x2×1x21x×1x31x×x1x2×11x4×1x41x×1x21x×11x3=x(1x)4
跟据广义二项式定理答案即为xn1的系数
ans=Cn1+3n1=n(n+1)(n+2)6

所以可以边读边膜,代码如下:

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define mod 10007
using namespace std;

string tmp;
long long n;

long long inv(long long a)
{
    int b=mod-2,ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}

int main()
{
    cin>>tmp;
    for(int i=0;i<tmp.length();i++)
    {
        n=(n*10+tmp[i]-'0')%mod;
    }
    printf("%lld\n",((n*(n+1)%mod)*(n+2)%mod)*inv(6)%mod);
}
相关标签: 生成函数