zoukankan      html  css  js  c++  java
  • BZOJ3028 食物 (生成函数)

    首先 1+x+x^2+x^3+...+x^∞=1/(1-x)

    对于题目中的几种食物写出生成函数 (对于a*x^b , a表示方案数 x表示食物,b表示该种食物的个数)

    f(1)=1+x^2+x^4+...+x^∞=1/(1-x^2)

    f(2)=1+x

    f(3)=1+x+x^2

    f(4)=x+x^3+x^5+...+x^∞=x/(1-x^2)

    f(5)=1+x^4+x^8+...+x^∞=1/(1-x^4)

    f(6)=1+x+x^2+x^3

    f(7)=1+x

    f(8)=1+x^3+x^6+...+x^∞=1/(1-x^3)

    把这些母函数相乘得到最后各种食物个数的方案数。

    g(x)=x(1+x)^2(1+x+x^2)(1+x+x^2+x^3)/(1-x^2)^2(1-x^3)(1-x^4)

    因为 1+x+x^2=(1-x^3)/(1-x) , 1+x+x^2+x^3=(1-x^4)/(1-x) 

    可以得到g(x)=x/(1-x)^4

    对于(1-x)^-k的展开式为sigma(C(-k,n)*(-x)^n) 

    C(-k,n) = (-k)*(-k-1)*...*(-k-n+1)/n! = (-1)^n*(n+k-1)*(n+k-2)*...*k/n!=(-1)^n*C(n+k-1,n)

    那么 C(-k,n)*(-x)^n = C(n+k-1,n)*x^n

    所以 g(x)的第n项系数为 x*C(n-1+4-1,n-1)*x^n-1 即 C(n+2,3)

    对于所给的n取模,再求6关于10007的逆元即可

     1 var s:ansistring;
     2     n,i:longint;
     3 function pow(x,y:longint):longint;
     4 var sum:longint;
     5 begin
     6     sum:=1;
     7     while y>0 do
     8     begin
     9         if y mod 2=1 then sum:=sum*x mod 10007;
    10         x:=x*x mod 10007;
    11         y:=y div 2;
    12     end;
    13     exit(sum);
    14 end;
    15 begin
    16     readln(s);
    17     n:=0;
    18     for i:=1 to length(s) do
    19         n:=(n*10+ord(s[i])-48) mod 10007;
    20     writeln(n*(n+1)*(n+2)*pow(6,10005) mod 10007);
    21 end.
  • 相关阅读:
    vue学习(十四) 条件搜索框动态查询表中数据 数组的新方法
    vue学习(十三) 删除对象数组中的某个元素
    数据库管理
    PHP基础
    PHP基础之常量与变量
    Cobalt Strike简单使用
    phpstudy后门利用复现
    DNS劫持
    远程控制(远控Bin)
    php基础
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/4527248.html
Copyright © 2011-2022 走看看