BZOJ 3028: производящая функция еды

заглавие

\ (~ \)
BZOJ 3028
Описание

Это , очевидно , должно выйти на поездки, а последняя разница в том , что на этот раз он собирается вселенная приключения! Мы не обсуждаем , сколько он NC, он должен принять некоторые из его иллюзии ничего. Конечно, конечно , вы хотите , чтобы помочь ему вычислить количество программ , переносимых N элементов. На этот раз он был готов принять некоторые популярные продукты, такие как: персик Дора, куриные котлеты и т.д. Конечно, Чэндэ, у него какие - то странные ограничений: ограничения каждой пищи следующим образом :
Чэндэ Гамбург: четное число
Кокс: 0 или 1
курица: 0, 1 или 2
персика множество: нечетное число
цыпленка: кратно 4
булочек: 0, 1, 2 или 3
Картофельные чипсы свинины: не более а.
Хлеб: кратна 3.
Обратите внимание , что здесь мы , очевидно , слишком ленивы , чтобы рассмотреть , как пища пояса с пищей, но и то, что каждая пища все «один» в качестве единицы (потому что это фантазия вещь), даже при условии, что общая сумма добавляет до N Одно из возможных решений. Таким образом, для данного N, вам нужно подсчитать количество программ, и по модулю 10007.

вход

Введите число N, 1 <= N <= 10 ^ 500

Выход

Если это

Пример ввода

Ввод пробы. 1
. 1
Ввод пробы 2
. 5

Пример вывода

Пример вывода. 1
. 1
Выход Образец 2
35

анализ

Функции генерации можно увидеть:

Чэндэ Гамбург: \ (. {. FRAC 1. 1-Х} 1 + X + X ^ 2 + .... 4 ^ = \ ^ {2} \)

Кокс: \ (. 1 + X \)

Куриный: \ (.. 1 + X + X ^ 2 = \ FRAC {3-1} {Х} ^ 1-Х \)

Мульти Персик: \ (.. X + X + X ^ ^ 3. 5 + ... = \ FRAC {X} ^ {2} 1-Х \)

Куриный: \ (.... 1 + X + Х ^ ^ 4. 8 + ... = \ FRAC 1 {{}} 1. 4-Х ^ \)

Булочки: \ (... 1 + X + X + X ^ 2 ^ 3 = \ FRAC {4-1} {Х} ^ 1-Х \)

Картофельные чипсы Свинина: \ (. 1 + X \)

Хлеб: \ (.... 1 + X + X ^ ^ 3. 6. 9 + ... + X ^ = \ FRAC 1 {{}} 3. 1-Х ^ \)

Это является \ (\ FRAC {X} {(. 1-Х)}. 4 ^ \) .

Тогда в соответствии с формулой, производящей функцией \ (\ FRAC. 1 {} {(. 1-X) n ^} = (. 1 + X + X ^ 2 + ... + Х ^. 3) н- ^ \) , ища \ (м \) коэффициент эквивалентно числу комбинаций \ (. 1-п-с ^ {} _ {}. 1-п-т + \) .

Затем умножается на \ (X \) эквивалентна правой, она становится \ (п-C ^ {} _ {. 1-м-н-2} + \) , требования \ (п \) бит, ответ является \ (C 3_ ^ {п-2} + \) .

код

#include<bits/stdc++.h>
using namespace std;
const int mod=10007;
 
char buf[1<<15],*fs,*ft;
inline char getc() { return (ft==fs&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),ft==fs))?0:*fs++; }
template<typename T>inline void read(T &x)
{
    x=0;
    T f=1, ch=getchar();
    while (!isdigit(ch) && ch^'-') ch=getchar();
    if (ch=='-') f=-1, ch=getchar();
    while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
    x*=f;
}
 
template<typename T>inline void write(T x)
{
    if (!x) { putchar('0'); return ; }
    if (x<0) putchar('-'), x=-x;
    T num=0, ch[20];
    while (x) ch[++num]=x%10+48, x/=10;
    while (num) putchar(ch[num--]);
}
 
inline void exgcd(int a,int b,int &x,int &y)
{
    if (!b)
    {
        x=1,y=0;
        return ;
    }
    exgcd(b,a%b,x,y);
    int tmp=x;
    x=y;
    y=tmp-a/b*y;
}
 
char ch[510];
int main()
{
    scanf("%s",ch+1);
    int len=strlen(ch+1),n=0;
    for (int i=1; i<=len; ++i) n=((n<<1)+(n<<3)+(ch[i]^48))%mod;
    int x,y;
    exgcd(6,mod,x,y);
    x=(x%mod+mod)%mod;
    write((n%mod*(n+1)%mod*(n+2)%mod)*x%mod),puts("");
    return 0;
}

рекомендация

отwww.cnblogs.com/G-hsm/p/11318529.html