18025 小明的密碼

2022-03-07 22:26:26 字數 1632 閱讀 5426

時間限制:4000ms  記憶體限制:65535k

提交次數:0 通過次數:0

題型: 程式設計題   語言: g++;gcc

小明的密碼由n(1<=n<=12)個數字構成,每個數字都可以是0至9中任意乙個數字,但小明的密碼還有

乙個特點就是密碼中連續的m(1<=m<=4)個數字的和是質數,現給定m和n,求滿足條件的密碼共有多少

個?

第1行是t,case數量,此後t行,每行兩個數,n和m

每個case輸出乙個滿足條件的密碼總數

2

1 12 1

4

16

admin

scau 小明的密碼—深度優先搜尋(dfs)。應該說是暴力深搜(700ms過了...題目對時間的限制已經是很水的了...);我的做法是邊生成邊測試, 是 連續m段的生成。在dfs()函式裡加乙個引數sum記錄前面m-1個密碼的總和。   如果當前訪問的位置pos是小於m的,則在該位置迴圈放置0~9,然後進入下一層dfs。如果大於等於m了, 也在該位置迴圈放置0~9並判斷sum+i是否為素數,如果是 則進入下一層dfs,且將引數sum改為sum+i-a[pos-m+1]; 即sum加上當前位置的數字後再減去這m段密碼的首位置的數字。  所以,概括的來說就是在不停的維護乙個長度為m的區間的數字總和,sum記錄最新的m-1個連續數字的和,然後判斷當前位置(也就是這個連續m段的最後乙個位置)的數字需要為什麼時能使這個m段總和為素數。 在進入下一層dfs前,得把這個位置的數字加到sum裡去,再減去剛剛得到的這個長度為m的段的首個數字,於是又得到乙個m-1段的總和,然後在下一層dfs裡判斷下個位置為多少時能和這個m-1個數字的和組成素數.....以此遞推下去,,,                       感覺這題的解釋自己講的好囉嗦,而且表達的也並不清楚,看**吧

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 

9 #include 10 #include 11 #include 12 #include 13 #include 14

#define ll long long

15#define inf 0x3f3f3f3f

16using

namespace

std;

1718

//得出素數表 (素數篩選法)

19bool prime[56

];20

void get_prime()//

m最大為4,所以篩選出前50素數足矣了。

2132

//33

int a[20];//

陣列a用來存放密碼

34int

cnt,n,m;

35void dfs(int pos,int

sum)

3644

if(pos//

如果當前檢驗的密碼段還不到m長度

4551}52

else

5361}62

}63}64

intmain()

6577

return0;

78 }

小明的難題

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 小明正在學習字串,他在書上見到了乙個問題 給你乙個字串 s,對於 s 中下標為偶數的字元 ci 如果 ci 是小寫字母,就將它變成大寫,否則,不改變。最後輸出操作後的字串 s。輸入 第一行輸入乙個整數 n,代表有 n 組測試資料...

無聊的小明

描述 這天小明十分無聊,沒有事做,但不甘於無聊的小明聰明的想到乙個解決無聊的辦法,因為他突然對數的正整數次冪產生了興趣。眾所周知,2的正整數次冪最後一位數總是不斷的在重複2,4,8,6,2,4,8,6 我們說2的正整數次冪最後一位的迴圈長度是4 實際上4的倍數都可以說是迴圈長度,但我們只考慮最小的迴...

開心的小明

描述 小明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早小明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每件物品規定了乙個重要...