日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【计蒜客信息学模拟赛1月月赛 - D】Wish(dp计数,数位)

發(fā)布時(shí)間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【计蒜客信息学模拟赛1月月赛 - D】Wish(dp计数,数位) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題干:

如果一個(gè)數(shù)大于等于?10且任意連續(xù)兩位都是質(zhì)數(shù),那么就稱之為 Wish 數(shù)。當(dāng)然,第一個(gè) Wish 數(shù)是?11。

比如 97,111,131,119 都是 Wish 數(shù),而?12,136 則不是。

問第?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ù)字,開頭為 j 的 wish 數(shù),那么他就可以由 dp [ i - 1] [ 預(yù)處理的 g[ j ]? ]轉(zhuǎn)移而來,注意處理邊界,也就是i==2的情況。

需要f [ i ]存儲(chǔ)的是 長(zhǎng)度為 i 的Wish總數(shù) ,最后根據(jù)res去具體定位那個(gè)數(shù)是個(gè)幾位數(shù)(也就是看還剩下多少數(shù)可以放)。然后從 高位開始確定每一位數(shù)字是什么,枚舉每一位數(shù)字時(shí)候從小到大。。這也是為什么預(yù)處理的時(shí)候需要兩層循環(huán),而非10~99這樣,就是因?yàn)檫@個(gè)順序問題。

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ù)字開頭 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ǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。