容斥原理 分糖(SOJ 747)

2021-09-26 10:38:08 字數 1903 閱讀 7428

分糖

題目描述

有 n 個(相同的)糖果,m 個(不同的)小朋友。m 和 n 滿足:1≤m≤n≤100000(105)。

要求:1.每個小朋友都至少有乙個糖果。

2.不存在正整數 x(x>=2),使得每個小朋友的糖果數都是 x 的倍數。

3.糖果不能剩餘。

求分糖方法總數。答案模 1000000007(109+7)

輸入格式

第一行為資料組數:t<=100000。

接下來 n 行,每行 2 個如上文所示的正整數 n,m。

輸出格式

輸出 t 行,每行乙個整數,為答案。

注意取模!

analysis

難度不是很大的一道題啦:)

正難則反

我們統計每個小朋友的糖果數都是 x 的倍數的情況

顯然x應該是n的因數

那麼問題就變成了將n分解質因數

然後容斥一下

方案數的話就是將a個相同物品放入b個不同集合,集合非空的情況

a ns

=ca−

1b−1

ans=c_^

ans=ca

−1b−

1​code

#include

#define int long long

#define re register

#define in read()

using

namespace std;

inline

intread()

return f==

1?res:

-res;

}const

int n=

1e5;

const

int p=

1e9+7;

typedef

long

long ll;

int t,n,m;

int fac[n+10]

,ifac[n+10]

;inline ll ksm

(ll x,ll b)

return res;

}int mark[n+10]

,pri[n+10]

,tot=0;

void

init()

} fac[0]

=1;for

(re int i=

1;i<=n;

++i) fac[i]

=fac[i-1]

*i%p;

ifac[n]

=ksm

(fac[n]

,p-2);

for(re int i=n-

1;i>=0;

--i) ifac[i]

=ifac[i+1]

*(i+1)

%p;}

int cnt=

0,a[n]

;void

divide

(int x)

if(x>

1) a[

++cnt]

=x;}

ll c

(ll x,ll y)

bool

cmp(

const

int a,

const

int b)

ll ans;

void

dfs(

int pos,

int sum,

int t)

dfs(pos+

1,sum*a[pos]

,t^1);

dfs(pos+

1,sum,t);}

void

work()

signed

main()

return0;

}

容斥原理(SOJ3082)

2012 04 24 21 38 48 soj3082 這道題的題意是說,給出一排長度為n的格仔,現在使用m種顏色對n個格仔塗色。要求 相鄰的格仔不同色並且m種顏色都要使用。給出n,m,求塗色的方案數。剛開始我考慮用遞推公式來做,但是推不出來而且n的範圍是10 9,m的範圍是10 3也不能用表來存。...

SDUT 2455 分糖果(容斥原理)

題目鏈結 第一眼看到這個題問題的時候覺得是水dp啊,狀態轉移很容易看出來dp i j sum dp i 1 j k 0 k p dp i j 前i個人,已經分了j個糖果的方案。大約o n 3 的複雜度,我就交了,果斷tle,然後想了想把列舉k給優化掉,o n 2 複雜度,目測應該沒有問題了把。結果還...

HDU3388 二分 容斥原理

題目 coprime 題意 給三個數m,n,k,0 思路 二分 容斥原理 由於所找的數與m,n互質,那麼這個數不能含有m,n所包含的素因子。但是k很大,不可能乙個乙個生成。於是二分,找到最小 的x,使得小於或等於x的數中滿足條件的 數的個數大於或等於k,則這個最小值即為答案。在判斷小於或等於x的數中...