POJ1091(容斥原理)(簡單歐幾里得)

2021-08-14 17:51:29 字數 1891 閱讀 8353

題目鏈結

跳蚤 time limit: 1000ms memory limit: 10000k

total submissions: 10856 accepted: 3371

description

z城市居住著很多只跳蚤。在z城市週六生活頻道有乙個娛樂節目。乙隻跳蚤將被請上乙個高空鋼絲的正**。鋼絲很長,可以看作是無限長。節目主持人會給該跳蚤發一張卡片。卡片上寫有n+1個自然數。其中最後乙個是m,而前n個數都不超過m,卡片上允許有相同的數字。跳蚤每次可以從卡片上任意選擇乙個自然數s,然後向左,或向右跳s個單位長度。而他最終的任務是跳到距離他左邊乙個單位長度的地方,並撿起位於那裡的禮物。

比如當n=2,m=18時,持有卡片(10, 15, 18)的跳蚤,就可以完成任務:他可以先向左跳10個單位長度,然後再連向左跳3次,每次15個單位長度,最後再向右連跳3次,每次18個單位長度。而持有卡片(12, 15, 18)的跳蚤,則怎麼也不可能跳到距他左邊乙個單位長度的地方。

當確定n和m後,顯然一共有m^n張不同的卡片。現在的問題是,在這所有的卡片中,有多少張可以完成任務。

input

兩個整數n和m(n <= 15 , m <= 100000000)。

output

可以完成任務的卡片數。

sample input

2 4sample output

hint

這12張卡片分別是:

(1, 1, 4), (1, 2, 4), (1, 3, 4), (1, 4, 4), (2, 1, 4), (2, 3, 4),

(3, 1, 4), (3, 2, 4), (3, 3, 4), (3, 4, 4), (4, 1, 4), (4, 3, 4)

中文題,不解釋題意。

要求的就是乙個序列a1

x1+a

2x2+

....

....

+anx

n+an

+1xn

+1=1

有解。也就是求滿足gc

d(a1

,...

...a

n+1)

=1的序列個數。由題意可得,最後乙個數an

+1是m,前面的n個數都小於等於m,那麼只要求這個序列中沒有公共因子就可以了,那用mn

−(有公

共因子的

序列數)

就可以了。

然後就可以用容斥原理求有公共因子的序列數了。

在進行奇加偶減的過程中,怎麼表示多個集合的並寫了好久,這裡記一下。

用類似樹的方式表示,進行深搜。

記下此時拿的是的第now位,是拿的第step個數,總共要拿stop個數。

此時要拿的數一定是now+1~最後一位中的乙個,然後遍歷每一種情況。再對它進行遞迴。

這樣就保證了一定會包含全部的情況。

如果這時已經拿夠了stop個,然後就可以計算了。具體看**吧。

#include

#include

#include

using

namespace

std;

#define ll long long

ll n,m,p[100],cnt,sum,a[100];

void fac()

if(m1 > 1)

p[cnt++] = m1;

}ll quick(ll a,ll b)

return res;

}void dfs(int now, int step,int stop)

for (int i = now; i < cnt; i++)

return;

}int main()

printf("%lld\n",res - ans);

}}

跳蚤 POJ 1091 容斥原理

跳蚤time limit 1000ms memory limit 10000k total submissions 8723 accepted 2601 description z城市居住著很多只跳蚤。在z城市週六生活頻道有乙個娛樂節目。乙隻跳蚤將被請上乙個高空鋼絲的正 鋼絲很長,可以看作是無限長。...

poj1091 跳蚤 容斥原理

思路 假設跳蚤選擇x1個第一張卡片,x2個第二張卡片。xn個第n張卡片,xn 1張寫著m的卡片,那麼就可以列出方程 a1 x1 a2 x2 an xn m x n 1 1 由於可以向左跳和向右跳,因此題目即問上述不定方程是否有解?答案以及它的證明可以在任何一本數論書中找到,它的充要條件是 a1,a2...

POJ1091 跳蚤 容斥

解題報告 設數字分別為a1 a2,a3 m 那麼若方程x1 a1 x 2a2 xn 1m 1有解 則這張卡片可行。而此方程有解的充要條件為gc d a1 a2,a3 m 1 所以本題即為求gc d a1 a2,a3 m 1 1 a 1,a2 a3 an m 的方案數。那麼可以反著求gc d a1 a...