codeforces 251E: Devu and Birthday Celebration(求把这个n分成f块,切这f块的gcd为1有多少种方法)
2016-08-03 13:53
363 查看
传送门:codeforces 251E: Devu and Birthday Celebration
题意:有一个q表示查询次数(q<=1e5),然后接下来一个n,f(1≤f≤n≤10^5),求把这个n分成f块,切这f块的gcd为1有多少种方法
思路:因为n<=1e5,所以每个数的因子最多有2^6个(2*3*5*11*13*17>1e5)所以我们对于每一个查询都可以枚举它的因子,然后利用莫比乌斯去重
组合数可以利用逆元就行计算(隔板法),要先预处理,不然会T
题意:有一个q表示查询次数(q<=1e5),然后接下来一个n,f(1≤f≤n≤10^5),求把这个n分成f块,切这f块的gcd为1有多少种方法
思路:因为n<=1e5,所以每个数的因子最多有2^6个(2*3*5*11*13*17>1e5)所以我们对于每一个查询都可以枚举它的因子,然后利用莫比乌斯去重
组合数可以利用逆元就行计算(隔板法),要先预处理,不然会T
#include<bits/stdc++.h> using namespace std; const int maxn=101000; const int MOD=1e9+7; int cnt; int a[maxn],Count[maxn]; long long Pow[maxn],INV[maxn]; bool check[maxn]; int prime[maxn],mu[maxn],tot; void Moblus(){ memset(check,false,sizeof(check)); mu[1]=1,tot=0; for(int i=2;i<maxn;i++){ if(!check[i]){ prime[tot++]=i; mu[i]=-1; } for(int j=0;j<tot&&i*prime[j]<maxn;j++){ check[i*prime[j]]=true; if(i%prime[j]) mu[i*prime[j]]=-mu[i]; else{ mu[i*prime[j]]=0; break; } } } } void solve(int n){ int num=sqrt(n+1); for(int i=1;i<=num;i++){ if(n%i==0){ a[cnt++]=i; if(i*i!=n) a[cnt++]=n/i; } } } long long inv(long long a,long long m){ if(a==1) return 1; return inv(m%a,m)*(m-m/a)%m; } int main(){ Moblus(); int _,n,f; Pow[0]=1; for(int i=1;i<maxn;i++) Pow[i]=Pow[i-1]*i%MOD; for(int i=0;i<maxn;i++) INV[i]=inv(Pow[i],MOD); scanf("%d",&_); while(_--){ scanf("%d%d",&n,&f); cnt=0; solve(n); sort(a,a+cnt); long long ans=0; for(int i=0;i<cnt;i++){ //分成两半,切一刀 if(n/a[i]<f) break; Count[a[i]]=Pow[n/a[i]-1]*INV[n/a[i]-f]%MOD*INV[f-1]%MOD; ans=(ans+1LL*Count[a[i]]*mu[a[i]])%MOD; } printf("%lld\n",(ans+MOD)%MOD); } return 0; }
相关文章推荐
- CodeForces 329 E.Devu and Birthday Celebration(莫比乌斯反演+组合数学)
- CF(439E - Devu and Birthday Celebration)莫比乌斯容斥
- codeforces439E: Devu and Birthday Celebration
- 439 E. Devu and Birthday Celebration
- CF 439 E. Devu and Birthday Celebration 莫比乌斯反演
- Codeforces 711 E. ZS and The Birthday Paradox(数学)——Codeforces Round #369 (Div. 2)
- CodeForces 713A|Sonya and Queries|字典树|没方法
- Incompatible types:'TDBGridEh' and 'TDBGrid' 出现这个错误的解决方法
- [Codeforces 711E] ZS and The Birthday Paradox (数学+Legendre公式)
- codeforces 251 div2 D. Devu and his Brother 三分
- 求一个季度有多少个星期以及这个季度中具体某天是星期几的方法
- #Codeforces 343 [div2] D. Babaei and Birthday Cake 【线段树优先队列查询优化】
- codeforces 451 E Devu and Flowers
- codeforces - E. Devu and Flowers & LightOJ 1124 Cricket Ranking(容斥定理+lucas定理)
- Codeforces 439 A. Devu, the Singer and Churu, the Joker
- codeforces 629D-Babaei and Birthday Cake(dp && 线段树或树状数组离散优化)
- 一元的硬币分成1分,2分,5分的方法有多少种???
- codeforces 251 div2 C. Devu and Partitioning of the Array 模拟
- 看这个算式:☆☆☆ + ☆☆☆ = ☆☆☆ 如果每个五角星代表 1 ~ 9 的不同的数字。这个算式有多少种可能的正确填写方法?
- 判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。