分糖
題目描述
有 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−
1code
#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的數中...