pro
blem
desc
ript
io
nproblem description
proble
mdes
crip
tion
由 0和
1組成的
串中,不
能表示為
由幾個相
同的較小
的串連線
成的串,
稱為本原
串,有多
少個長為
n(
n<
=100000000)的
本原串?
由0和1組成的串中,不能表示為由幾個相同的較小的串連線成的串,稱為本原串,有多少個長為n(n<=100000000)的本原串?
由0和1組成
的串中,
不能表示
為由幾個
相同的較
小的串連
接成的串
,稱為本
原串,有
多少個長
為n(n
<=1
0000
0000
)的本原
串?答 案m
od
2008.
答案mod\ 2008.
答案mod2
008.
例 如,
100100不是
本原串,
因為他是
由兩
個100組成
,而
1101是本
原串
。例如,100100不是本原串,因為他是由兩個100組成,而1101是本原串。
例如,100
100不
是本原串
,因為他
是由兩個
100組
成,而1
101是
本原串。
input
輸入包括多個資料,每個資料一行,包括乙個整數n,代表串的長度。
output
對於每個測試資料,輸出一行,代表有多少個符合要求本原串,答案mod2008.
sample input12
34sample output22
612題意說的是有乙個長度為n的01串。每個位置都可以為0或者為1。問這個長度為n的串可以由0和1組成沒有迴圈節的串 有多少種方案。
思路:每個位置都可以為0或者為1,所以一共有2
n2^n
2n種方案組成這個串,由於這個串不能有迴圈節,我們可以反向考慮有迴圈節的時候。有迴圈節的話,假設迴圈節長度為k
kk,則必然有k∣n
k|nk∣
n,即找到n的因子,每個因子代表乙個迴圈節的長度,比如當n=8
n=8n=
8的時候,它的因子為1,2
,4
1,2,4
1,2,
4,那麼長度為1的串可能有212^
21種,長度為2的串可能有222^
22種,長度為4的串可能有2
42^4
24種。依據加法定理,把這些相加就包含了所有情況,但是!!!這裡面顯然有重複的啊!比如長度為1的串為1,長度為2 的串為11,顯然11111111這個串被重複構造,顯然長度為2的迴圈節不能再分成長度為1 的迴圈節才符合我們想要的要求,即不能有11這樣的長度為2的迴圈節。那可能麼辦?
我忍不住要問一句,您真的明白題目中本原串的定義嗎?
本原串的定義是長度為n
nn的串沒有迴圈節,而我們要的上述長度為k的迴圈節也是不能有迴圈節的,不然就會有重複。所以長度為k
kk的迴圈節顯然就是長度為k
kk的本源串。
綜上,我們可以遞迴的去尋找原串,在過程中避免重複尋找,把求過的本源串記下來就行了。
a cc
ode:
ac \ code:
accode
:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define read(x) scanf("%d",&x)
#define read(x,y) scanf("%d%d",&x,&y)
#define gc(x) scanf(" %c",&x);
#define mmt(x,y) memset(x,y,sizeof x)
#define write(x) printf("%d\n",x)
#define pii pair
#define inf 0x3f3f3f3f
#define ll long long
const
int n =
100000
+100
;const
int m =
3e6+
1005
;typedef
long
long ll;
unordered_map<
int,ll> hap;
//記錄求過的本源串
ll qpow
(ll a,ll b,ll p)
return ans;
}ll solve
(ll n)
if(i == n/i)
continue;if
(hap.
count
(n/i)
) sum =
(sum + hap[n/i])%
2008
;else}}
}return
(qpow(2
,n,2008
)- sum +
2008)%
2008;}
intmain()
}}
foj 2197 最小花費
problem 2197 最小花費 給乙個長度為n n 10 5 的 01 串,你可以任意交換乙個為0的位和乙個為1的位,若這兩位相鄰,花費為x,否則花費為y。求通過若干次交換後將串中的 1 全部變換到 0 前面的最小花費。第一行乙個整數t 1 t 10 表示測試資料的組數。接下來3 t行,每組資料...
洛谷 2197 模板 nim遊戲
題目描述 甲,乙兩個人玩nim取石子遊戲。nim遊戲的規則是這樣的 地上有n堆石子 每堆石子數量小於10000 每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取的人就輸了。假如甲是先手,且告訴你這n堆石子的數量,他想知道是否存在先手必勝的策略。輸...
洛谷 2197 nim遊戲(模板)
傳送門 題目描述 甲,乙兩個人玩 nim nimni m 取石子遊戲。n im nimni m 遊戲的規則是這樣的 地上有 n nn 堆石子 每堆石子數量小於 10000 10000 1000 0 每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取...