SCUT - 157 - CC和他的GCD - 容斥原理
鉴于多年(都没几个月)搞数论的经验,这种时候枚举g肯定是对的。
那么肯定是要莫比乌斯函数作为因子,因为很显然?
但是为什么要搞个负的呢?其实是因为这个题目的g1的时候并不都是合法的,反而是g2的时候都是合法的,所以g==6的时候才是重复的。
然后考虑怎么统计他们的倍数。
每次都因数分解,是很慢的。
考虑到这题的特征,数字特别小。用个cnt把每个数字都数一数。
然后从小的数字开始把它所有的倍数都加在它身上。
最后预处理一波组合数就可以了。
整体复杂度每次是\(O(nlogn)\)的,比\(O(n\sqrt{n})\)快了近10倍。
不过最后还是快读最快啊233!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=1e5;
int pri[MAXN+5];
int &pritop=pri[0];
int mu[MAXN+5];
void sieve(int n=MAXN) {
mu[1]=1;
for(int i=2; i<=n; i++) {
if(!pri[i]) {
pri[++pritop]=i;
mu[i]=-1;
}
for(int j=1; j<=pritop; j++) {
int &p=pri[j];
int t=i*p;
if(t>n)
break;
pri[t]=1;
if(i%p) {
mu[t]=-mu[i];
} else {
mu[t]=0;
break;
}
}
}
}
const int mod=1e9+7;
int inv[MAXN+5],fac[MAXN+5],invfac[MAXN+5];
void init_fac_invfac(int n=MAXN) {
inv[1]=1;
for(int i=2; i<=n; i++)
inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
fac[0]=1,invfac[0]=1;
for(int i=1; i<=n; i++) {
fac[i]=1ll*fac[i-1]*i%mod;
invfac[i]=1ll*invfac[i-1]*inv[i]%mod;
}
}
inline ll C(ll n,ll m) {
if(n<m)
return 0;
return 1ll*fac[n]*invfac[n-m]%mod*invfac[m]%mod;
}
inline int read(){
int x=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
do{
x=(x<<3)+(x<<1)+c-'0';
c=getchar();
}while(c>='0'&&c<='9');
return x;
}
inline void write(int x){
if(x>9){
write(x/10);
}
putchar(x%10+'0');
return;
}
int cnt[MAXN+5];
int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
sieve();
init_fac_invfac();
int n,m;
while(~scanf("%d%d",&n,&m)) {
memset(cnt,0,sizeof(cnt));
for(int i=1; i<=n; i++) {
int tmp=read();
cnt[tmp]++;
}
for(int d=2;d<=100000;d++){
for(int td=d+d;td<=100000;td+=d)
cnt[d]+=cnt[td];
}
ll sum=0;
for(int d=2; d<=100000; d++) {
if(mu[d]==0||cnt[d]<m)
continue;
ll tmp=(-mu[d])*C(cnt[d],m);
if(tmp>=mod||tmp<=-mod) {
tmp%=mod;
}
if(tmp<0)
tmp+=mod;
sum+=tmp;
if(sum>=mod)
sum-=mod;
}
write((int)sum);
puts("");
}
}
SCUT - 157 - CC和他的GCD - 容斥原理的更多相关文章
- 51nod 1678 lyk与gcd | 容斥原理
51nod 200题辣ψ(`∇´)ψ !庆祝! 51nod 1678 lyk与gcd | 容斥原理 题面 这天,lyk又和gcd杠上了. 它拥有一个n个数的数列,它想实现两种操作. 1:将 ai 改为 ...
- HDU 1695 GCD#容斥原理
http://acm.hdu.edu.cn/showproblem.php?pid=1695 翻译题目:给五个数a,b,c,d,k,其中恒a=c=1,x∈[a,b],y∈[c,d],求有多少组(x,y ...
- hdu1695 GCD 容斥原理
Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD(x, y) = k. GCD(x, y) ...
- SCUT - 354 - CC的简单多项式 - 杜教筛
https://scut.online/p/354 跟多项式一点关系都没有. 注意到其实两个多项式在1处求值,那么就是他们的系数加起来. 列一列发现系数就是n以内两两求gcd的值,还自动把0去掉了. ...
- CC DGCD:Dynamic GCD——题解
https://vjudge.net/problem/CodeChef-DGCD https://www.codechef.com/problems/DGCD 题目大意: 给一颗带点权的树,两个操作: ...
- SCUT - 274 - CC B-Tree - 树形dp
https://scut.online/p/274 首先要判断是一颗树,并且找出树的直径. 是一棵树,首先边恰好有n-1条,其次要连通,这两个条件已经充分了,当然判环可以加速. 两次dfs找出直径,一 ...
- SCUT - 271 - CC 非诚勿扰 - FFT
https://scut.online/p/271 第一次遇到没这么裸的,其实感觉到是卷积但是不知道怎么化.看来以后要多注意下标. #include <bits/stdc++.h> usi ...
- 1052 - String Growth
1052 - String Growth PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Z ...
- POJ 2115 C Looooops
扩展GCD...一定要(1L<<k),不然k=31是会出错的 .... C Looooops Time Limit: 1000MS Mem ...
随机推荐
- VC调用Delphi DLL
别的没什么,是一定可以调用成功的.但是意外的是,ShowMessage函数在DLL里也可以轻易被调用.此外,Delphi里的var 相当于VC里的引用,需要在函数原型里正确标识,否则传递普通变量甚至常 ...
- BZOJ1217: [HNOI2003]消防局的设立
BZOJ1217: [HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地. 起初为了节约材料,人类只修建了n-1条道路来连接这些基地 ...
- js日历学习
<!DOCTYPE html><html><head><title>自己写的JS日历,适合学习</title><script src= ...
- 【zabbix】Windows服务器获取IIS站点以及程序池状态
在使用zabbix做Windows服务器监控的时候遇到一个比较棘手的问题,检测IIS站点状态. 普通情况下,只要用浏览器访问iis站点测试一下返回码是不是200即可判断状态,但是我这次遇到的是iis使 ...
- Vue:实践学习笔记(6)——使用SLOT分发内容
Vue:实践学习笔记(6)——使用SLOT分发内容 Slot Slot是什么 Slot是父子组件的通讯方式,可以将父组件的内容显示到子组件之中. 使用SLOT前 比如我在定义组件的时候,在里面输入了X ...
- python读写txt大文件
直接上代码: import easygui import os path = easygui.fileopenbox()#path是打开的文件的全路径 if path:#如果选择打开文件,没有选择取消 ...
- 纯CSS3实现淡入淡出下拉菜单
纯CSS3实现淡入淡出下拉菜单是一款比较简单清新的CSS3教程下拉菜单,这款下拉菜单是垂直方向的,点击主菜单项可以展开和折叠子菜单,在展开折叠的过程中伴随着淡入淡出的动画效果 源代码:http://w ...
- jenkins maven tomcat做持续集成
maven 采用 maven 3.0以上的版本.tomcat 采用 tomcat 7.0 以上的版本 1. tomcat 配置用户账号和权限 tomcat-users.xml <role rol ...
- [acm]HDOJ 2673 shǎ崽 OrOrOrOrz
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2673 拍两次序,交替输出 #include<iostream> #include< ...
- 关于Django ORM filter方法小结
django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...