hdu2197 本原串(容斥)

2021-10-01 14:12:54 字數 3026 閱讀 6310

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 每人每次可從任意一堆石子裡取出任意多枚石子扔掉,可以取完,不能不取。每次只能從一堆裡取。最後沒石子可取...