BZOJ 3209 花神的数论题

一道简单的数位DP.

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 #define ll long long
 6 #define FILE "dealing"
 7 #define up(i,j,n) for(int i=j;i<=n;i++)
 8 #define db long double 
 9 #define pii pair<int,int>
10 #define pb push_back
11 #define mem(a,L) memset(a,0,sizeof(int)*(L+1))
12 template<class T> inline bool cmin(T& a,T b){return a>b?a=b,true:false;}
13 template<class T> inline bool cmax(T& a,T b){return a<b?a=b,true:false;}
14 template<class T> inline T squ(T a){return a*a;}
15 const ll maxn=210000+10,inf=1e9+10,mod=10000007,M=9988440;
16 ll read(){
17     ll x=0,f=1,ch=getchar();
18     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
19     while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
20     return x*f;
21 }
22 ll n;
23 int w[70];
24 ll c[70][70];
25 ll num[70];
26 ll qpow(ll a,ll b){
27     ll ans=1;
28     while(b){
29         if(b&1)ans=ans*a%mod;
30         a=a*a%mod;
31         b>>=1;
32     }
33     return ans;
34 }
35 int main(){
36     freopen(FILE".in","r",stdin);
37     freopen(FILE".out","w",stdout);
38     n=read();int s=0;
39     while(n){
40         w[++w[0]]=n&1;
41         if(n&1)s++;
42         n>>=1;
43     }
44     c[0][0]=1;
45     for(int i=1;i<=w[0];i++){
46         c[i][0]=1;
47         for(int j=1;j<=w[0];j++)
48             c[i][j]=(c[i-1][j-1]+c[i-1][j])%M;
49     }
50     int k=0;
51     for(int i=w[0];i>=1;i--){
52         if(w[i]==1){
53             for(int j=0;j<i;j++)
54                 (num[j+k]+=c[i-1][j])%=M;
55             k++;
56         }
57     }
58     num[s]++;
59     ll ans=1;
60     for(int i=1;i<60;i++)
61         ans=ans*qpow(i,num[i])%mod;
62     printf("%lld\n",ans);
63     return 0;
64 }
View Code

 

posted @ 2017-05-04 08:56  CHADLZX  阅读(133)  评论(0编辑  收藏  举报