2019 Shanghai Online Contest Problem D Counting Sequences I

搜索思维题

#include
using namespace std;
typedef long long ll;
const int Max=3000;
const ll M=1e9+7;
ll ANS[Max+10],JC[Max+10],INV[Max+10];
void F(int x,int mul,int sum,int num,ll inv){
    if(x==1){
        int xx=mul-sum;
        if(xx>=0&&num+xx<=Max){
            ANS[num+xx]=(ANS[num+xx]+JC[num+xx]*inv%M*INV[xx]%M)%M;
        }
        return;
    }
    F(x-1,mul,sum,num,inv);
    for(int i=1;mul*x<=Max*2;++i){
        mul=mul*x;
        F(x-1,mul,sum+x*i,num+i,INV[i]*inv%M);
    }
    return;
}
ll Pow(ll x,ll y){
    ll ans=1;
    for(;y;y/=2,x=x*x%M)if(y%2==1)ans=ans*x%M;
    return ans;
}
int main(){
    JC[0]=1;
    for(ll i=1;i<=Max;++i)JC[i]=JC[i-1]*i%M;
    for(ll i=0;i<=Max;++i)INV[i]=Pow(JC[i],M-2);
    F(Max,1,0,0,1);
    int T;cin>>T;while(T--){
        int x;
        cin>>x;
        cout<

 

你可能感兴趣的:(组合数学)