zoukankan      html  css  js  c++  java
  • 「BZOJ 3209」花神的数论题

    戳我

    Title Solution

    这道题可以运用组合数的思想啊,数位dp也可以,随便你怎么做,这里就讲一讲组合数的做法吧,要小于n,所以我们可以枚举n二进制下1的位置,在i-1后面选j个1.用组合数做一下就好了啊

    code

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int mod=10000007;
    int c[1011][1011],f[101];
    int read(){
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9')  f=(c=='-')?-1:1,c=getchar();
        while(c>='0'&&c<='9')  x=x*10+c-'0',c=getchar();
        return x*f;
    }
    void init(){
        for(int i=0;i<=1000;i++)
            c[i][i]=c[i][0]=1;
        for(int i=2;i<=1000;i++)
            for(int j=1;j<i;j++)
                c[i][j]=c[i-1][j]+c[i-1][j-1];
    }
    int ksm(int a,int b){
        int ans=1;
        while(b){
            if(b&1)
                ans=ans*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return ans;
    }
    main(){
        int n=read(),ans=1,js=0;
        init();
        for(int i=50;i>=0;i--){
            if((n>>i)&1){
                for(int j=1;j<=i;j++)
                    f[js+j]+=c[i][j];
                f[++js]++;
            }
        }
        for(int i=1;i<=50;i++)
            ans*=ksm(i,f[i]),ans%=mod;
        printf("%lld",ans);
    }
    
    
    
  • 相关阅读:
    053364
    053363
    oracle导出批量表N行记录
    053362
    053361
    053360
    053359
    053358
    053357
    053356
  • 原文地址:https://www.cnblogs.com/hbxblog/p/10223410.html
Copyright © 2011-2022 走看看