BZOJ 3028:食品生成機能

タイトル

\(〜\)
BZOJ 3028
説明

これは明らかに旅行に出て行かなければならない、と最後の違いは、この時間は、彼は宇宙の冒険に行っていたということです!私たちは、彼が彼の幻想何かのいくつかを取る必要があり、どのくらい彼NCについては説明しません。もちろん、もちろん、あなたは彼がN項目によって運ばれるプログラムの数を計算する手助けをしたいです。もちろんなど桃ドラ、チキンバーガー、それは承徳、彼はいくつかの奇妙な制限事項があります:彼のようないくつかの人気の食品を取る準備ができていた。この時、次のように各食品の制限は以下のとおりです。
承徳ハンブルク:偶数
コークス:0または1羽の
鶏:0、1、又は2
桃複数:の奇数
鶏:4つの倍数で
0、1、2、または3:パン
ポテトチップス豚肉:以下A。
パン:3の倍数
にも限り合計がNにつながりますよう、ここでは明らかにどのように食品と食品ベルト考慮するのが面倒であることを、だけでなく、(それはファンタジーものであるため)、各食品単位としてすべての「1」であることに注意してください一つの解決策。このように、与えられたNのために、あなたは、プログラムの数を計算する必要があり、10007を法。

入力

数N、1 <= N <= 10 ^ 500を入力

出力

その場合は

サンプル入力

サンプル入力1
。1つの
入力サンプル2
。5

サンプル出力

サンプル出力。1
。1つの
出力サンプル2
35

分析

生成機能を見ることができます。

承徳ハンブルク:\(1 + X + X ^ 2 + ... 4 ^ = \ {。FRAC 1. 1-X} ^ {2} \)

コークス:\(+ X \ 1。)

ニワトリ:\(1 + X + X ^ 2 = \ FRAC {3-1} {X} ^ 1-X \。)。

マルチピーチ:\(。。X + X + X ^ ^ 3。5 +···= FRAC {X} ^ {2} 1-X \ \)

ニワトリ:\(1 + X + X ^ ^ 4 8 + ... = \ FRAC 1 {{}} 1. 4-X ^ \。。。。)

パン:\(1 + X + X + X ^ 2 ^ 3 = \ FRAC {4-1} {X} ^ 1-X \。。。)

ポテトチップスポーク:\(+ X \ 1。)

パン:\(。。。。1 + X + X ^ ^ 3 6 9 + ... + X ^ = \ FRAC 1 {{}} 3. 1-X ^ \)

それによってある(\ \ FRAC {X} {(1-X)}。4 ^ \)

次いで、式に従って関数発生(\ \ FRAC。1 {} {(1-X)N - ^} =(1 + X + X ^ 2 + ... + X ^ 3)N- ^)\を探し、\(mは\)係数は、組み合わせの数に相当する(\ 1-N-C ^ {} _ {} 1-N-M + \)

次いで、乗算される\(Xは\)正しいものに相当し、それはなり\(N-C ^ {} _ {1-M-N-2} + \)の要件(\ \ N-)ビット、解答されている(C 3_ ^ {N-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