問題シミュレーションゲームアレンジメント

ハッハッハ新年を教えてもいい

今年は、あまりにも退廃年です。

良いので、負のエネルギーに満ち以降

 

 

 

 

 

分析:

本当に面白い数学的な再帰は、法を見つける、問題を。

テストに考え抜かれ、その後、N2 ^ n型形状の圧力は考えることはできません

* 20 20は単に直接テーブル2333を打ちます。

M> = 2 * n-1の場合、放電がS(N、M)のためにどのように配置するので、全体の構成とその接頭辞には影響を与えないであろう。

次に、どのように需要

その後、我々の精神(DA)光(ピョウ)(菅)フラッシュ(菅)MOD Nモードダウン、驚くほど計算が階乗ないことがわかったよりも大きいが0でなければなりません

今、あなたは40(霧のスコアを持っています

次に、正のソリューションを入力します。

S(n、m)は、もしM <= N忘れないで、無溶液用

だから、ここでm <2 * N-1の<考えるのn

まず、第1のMn元素のため、気軽な結果には影響しません置きます

最初のM-N + 1つの要素は、任意のM-N + 1つの選択肢を配置することができます

しかし、n番目の要素のために、唯一の選択肢は、MNこと

このとき、M-N + 2要素に対して、正確にM-N + 1の選択肢が存在します

しかし、n-1個の要素のこの数、唯一の選択肢は、MN

などなど。私たちは、再帰式に来て:

S(N、M)=(MN)!*(MN + 1)^(丸め/ 2で(IK))*(MN)^((IK)/ 2は、低級四捨五入)

激しくプッシュし、S(I、I + k)は、本質的に幾何学的配列の加算であります

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>

#define maxn 21
#define MOD 20000023

using namespace std;

inline long long getint()
{
    long long num=0,flag=1;char c;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
    while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
    return num*flag;
}

int fac[MOD],sum[MOD];
long long n,K;

inline void init()
{
    fac[1]=1;
    for(int i=2;i<MOD;i++)fac[i]=1ll*fac[i-1]*i%MOD;
    for(int i=1;i<MOD;i++)sum[i]=(sum[i-1]+fac[i])%MOD;
}

inline long long ksm(long long num,long long k)
{
    long long ret=1;
    for(;k;k>>=1,num=num*num%MOD)if(k&1)ret=ret*num%MOD;
    return ret;
}

int main()
{
    int T=getint();
    init();
    while(T--)
    {
        n=getint(),K=getint();
        if(n<=K+1)printf("%d\n",sum[min(n,1ll*(MOD-1))]);
        else if(K+1>=MOD)printf("%d\n",sum[MOD-1]);
        else
        {
            int k=n-K,ans=sum[K-1];
            int A=1ll*K*(K+1)%MOD;
            int inv=ksm(A-1,MOD-2);
            ans=(ans+1ll*fac[K]*(ksm(A,k/2+1)-1)%MOD*inv%MOD)%MOD;
            ans=(ans+1ll*fac[K]*(ksm(A,(k-1)/2+1)-1)%MOD*(K+1)%MOD*inv%MOD)%MOD;
            printf("%d\n",ans);
        }
    }
}
View Code

おすすめ

転載: www.cnblogs.com/Darknesses/p/12142147.html