洛谷P2518 [HAOI2010]计数
生活随笔
收集整理的這篇文章主要介紹了
洛谷P2518 [HAOI2010]计数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
你有一組非零數(shù)字(不一定唯一),你可以在其中插入任意個0,這樣就可以產(chǎn)生無限個數(shù)。比如說給定{1,2},那么可以生成數(shù)字12,21,102,120,201,210,1002,1020,等等。
現(xiàn)在給定一個數(shù),問在這個數(shù)之前有多少個數(shù)。(注意這個數(shù)不會有前導(dǎo)0).
輸入輸出格式
輸入格式:
?
只有1行,為1個整數(shù)n.
?
輸出格式:
?
只有整數(shù),表示N之前出現(xiàn)的數(shù)的個數(shù)。
?
輸入輸出樣例
輸入樣例#1:?復(fù)制 1020 輸出樣例#1:?復(fù)制 7說明
n的長度不超過50,答案不超過2^63-1.
題解
挺裸的數(shù)位dp(雖然我并不會)
懶得寫了,直接貼一下->這里
1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #define ll long long 5 using namespace std; 6 const int N=1005; 7 int a[N],v[N],n;ll c[N][N],ans; 8 ll gc(int n,int m){ 9 if(c[n][m]) return c[n][m]; 10 if(m==1) return n; 11 if(m==0||m==n) return 1; 12 if(m>n) return 0; 13 c[n][m]=gc(n-1,m)+gc(n-1,m-1); 14 return c[n][m]; 15 } 16 ll calc(){ 17 ll res=1; 18 int m=n; 19 for(int i=0;i<10;++i) if(a[i]) res*=gc(m,a[i]),m-=a[i]; 20 return res; 21 } 22 int main(){ 23 //freopen("testdata.in","r",stdin); 24 char ch; 25 while(cin>>ch)if(isdigit(ch))v[++n]=ch-48,a[v[n]]++; 26 int nn=n; 27 for(int i=1;i<=nn;++i){ 28 --n; 29 for(int j=0;j<v[i];++j) 30 if(a[j]){--a[j],ans+=calc(),++a[j];} 31 --a[v[i]]; 32 } 33 printf("%lld\n",ans); 34 return 0; 35 }?
轉(zhuǎn)載于:https://www.cnblogs.com/bztMinamoto/p/9538921.html
總結(jié)
以上是生活随笔為你收集整理的洛谷P2518 [HAOI2010]计数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【产品功能】价格信息支持下载
- 下一篇: Nginx的upstream_respo