牛牛和羊羊在玩乙個有趣的猜數遊戲。在這個遊戲中,牛牛玩家選擇乙個正整數,羊羊根據已給的提示猜這個數字。第i個提示是」y」或者」n」,表示牛牛選擇的數是否是i的倍數。
例如,如果提示是」yynyy」,它表示這個數使1,2,4,5的倍數,但不是3的倍數。
注意到一些提示會出現錯誤。例如: 提示」nyyy」是錯誤的,因為所有的整數都是1的倍數,所以起始元素肯定不會是」n」。此外,例如」ynny」的提示也是錯誤的,因為結果不可能是4的倍數但不是2的倍數。
現在給出乙個整數n,表示已給的提示的長度。請計算出長度為n的合法的提示的個數。
例如 n = 5:
合法的提示有:
ynnnn ynnny ynynn ynyny yynnn yynny
yynyn yynyy yyynn yyyny yyyyn yyyyy
所以輸出12
輸入描述:
輸入包括乙個整數n(1 ≤ n ≤ 10^6),表示已給提示的長度。
輸出描述:
輸出乙個整數,表示合法的提示個數。因為答案可能會很大,所以輸出對於1000000007的模
拿到這道題,首先想到用dp的方法,但是當其為非素數的時候,無法形成暴力搜尋方法。參考其他人的思路,發現,
1.第i個數是素數,這時候取yn都可以,那麼dp[i]=dp[i-1]*2。
2.第i個數不是素數的冪次,例如6,因為他會被2,3唯一確定,(自身的yn不由自己控制)所以說這時候有dp[i]=dp[i-1]。
3.第i個數是素數的冪次,它不能唯一確定,比如4,當集合中存在2,4時候,一共有yy,yn,nn三種情況,當集合中加入8時候,一共有yyy,nnn,yyn,ynn四種情況。例如10,這時候我們只需要進行計算的就是組合(2,4,8)(3,9)(5)*(7)=4*3*2*2=48;
**如下
#include
#include
#include
#include
using
namespace
std;
const
int mod = 1e9+7;
const
int maxn = 1e6+5;
int vis[maxn];
int main()
long
long mi = i;
while(mi <= n) //確定當前集合一共有多少個情況,例如2,4,6,8
ans = ans * (cnt + 1) % mod; //計算乙個集合中的值
}cout
<< ans << endl;
}}
牛客網 數串
設有n個正整數,將他們連線成一排,組成乙個最大的多位整數。如 n 3時,3個整數13,312,343,連成的最大整數為34331213。如 n 4時,4個整數7,13,4,246連線成的最大整數為7424613。有多組測試樣例,每組測試樣例包含兩行,第一行為乙個整數n n 100 第二行包含n個數 ...
牛客網 數對
題目描述 牛牛以前在老師那裡得到了乙個正整數數對 x,y 牛牛忘記他們具體是多少了。但是牛牛記得老師告訴過他x和y均不大於n,並且x除以y的餘數大於等於k。牛牛希望你能幫他計算一共有多少個可能的數對。輸入描述 輸入包括兩個正整數n,k 1 n 10 5,0 k n 1 輸出描述 對於每個測試用例,輸...
牛客網 數獨
數獨是乙個我們都非常熟悉的經典遊戲,運用計算機我們可以很快地解開數獨難題,現在有一些簡單的數獨題目,請編寫乙個程式求解。輸入描述 輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的。輸出描述 輸出九行,每行九個空格隔開的數字,為解出的答案。參考了答案解析 從三個方面來判斷缺失位置的數字,分...