【计蒜客信息学模拟赛1月月赛 - D】Wish(dp计数,数位)
題干:
如果一個(gè)數(shù)大于等于?10且任意連續(xù)兩位都是質(zhì)數(shù),那么就稱之為 Wish 數(shù)。當(dāng)然,第一個(gè) Wish 數(shù)是?11。
比如 97,111,131,119 都是 Wish 數(shù),而?12,136 則不是。
問(wèn)第?N?個(gè) Wish 數(shù)是多少。
輸入格式
一個(gè)整數(shù)?NN。
輸出格式
一個(gè) Wish 數(shù)。
數(shù)據(jù)范圍
對(duì)于?30\%30%?的數(shù)據(jù):1 \le N \le 211≤N≤21。
對(duì)于?60\%60%?的數(shù)據(jù):1 \le N \le 10001≤N≤1000。
對(duì)于?100\%100%?的數(shù)據(jù):1 \le N \le 97979797979797971≤N≤9797979797979797。
輸出時(shí)每行末尾的多余空格,不影響答案正確性
樣例輸入復(fù)制
1樣例輸出復(fù)制
11解題報(bào)告:
思路:預(yù)處理一下? 1 -? 9 每個(gè)數(shù)后面可以跟的能夠與它組成兩位數(shù)字并且為素?cái)?shù)的數(shù)字。
dp[ i ] [ j ]? i 的含義是 i 長(zhǎng)度為i 的數(shù)字,開(kāi)頭為 j 的 wish 數(shù),那么他就可以由 dp [ i - 1] [ 預(yù)處理的 g[ j ]? ]轉(zhuǎn)移而來(lái),注意處理邊界,也就是i==2的情況。
需要f [ i ]存儲(chǔ)的是 長(zhǎng)度為 i 的Wish總數(shù) ,最后根據(jù)res去具體定位那個(gè)數(shù)是個(gè)幾位數(shù)(也就是看還剩下多少數(shù)可以放)。然后從 高位開(kāi)始確定每一位數(shù)字是什么,枚舉每一位數(shù)字時(shí)候從小到大。。這也是為什么預(yù)處理的時(shí)候需要兩層循環(huán),而非10~99這樣,就是因?yàn)檫@個(gè)順序問(wèn)題。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e6 + 5; ll dp[45][10],f[45];//dp[i][j] : i位整數(shù)以j這個(gè)數(shù)字開(kāi)頭 vector<int> vv[11]; ll n,sum; string ans; bool is(int x) {if(x<2) return 0 ;for(int i = 2; i*i<=x; i++) {if(x%i == 0) return 0 ;}return 1; } int main() {for(int i = 0; i<10; i++) {for(int j = 0; j<10; j++) {if(is(i*10 + j)) vv[i].pb(j);}}for(int j = 1; j<10; j++) vv[10].pb(j); //for(int j = 1; j<10; j++) dp[2][j]=1;//f[2] = for(int i = 2; i<=40; i++) {for(int j = 1; j<10; j++) {int up = vv[j].size();for(int k = 0; k<up; k++) {int x = vv[j][k];if(i == 2) dp[i][j]++;else dp[i][j] +=dp[i-1][x] ;}f[i] += dp[i][j];}}cin>>n;int i=2;while(sum + f[i] < n) sum += f[i],i++;ll res = n;res -= sum;int x = 10;//枚舉首位 for(;i>=2; i--) {int up = vv[x].size();for(int k = 0; k<up; k++) {int j = vv[x][k];if(res - dp[i][j] > 0 ) res -= dp[i][j]; else {ans.pb('0'+j);x=j;break;} }}ans.pb('0'+vv[x][res-1]);cout << ans << endl;return 0 ;}?
總結(jié)
以上是生活随笔為你收集整理的【计蒜客信息学模拟赛1月月赛 - D】Wish(dp计数,数位)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【HDU - 6186】CS Cours
- 下一篇: pvlsvr.exe - pvlsvr是