BZOJ1101 [POI2007]Zap 和 CF451E Devu and Flowers
Zap
FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d。作为FGD的同学,FGD希望得到你的帮助。
Input
第一行包含一个正整数n,表示一共有n组询问。(1<=n<= 50000)接下来n行,每行表示一个询问,每行三个
正整数,分别为a,b,d。(1<=d<=a,b<=50000)
Output
对于每组询问,输出到输出文件zap.out一个正整数,表示满足条件的整数对数。
Sample Input
2
4 5 2
6 4 3
Sample Output
3
2
//对于第一组询问,满足条件的整数对有(2,2),(2,4),(4,2)。对于第二组询问,满足条件的整数对有(
6,3),(3,3)。
题解
原问题等价于求有多少对二元组\((x,y)\)满足\(x\le a/k,y\le b/k\)且\(x,y\)互质。
设\(D(a,b,k)\)表示满足\(x \le a,y \le b\)且\(k|\gcd(x,y)\)的二元组有多少对,显然\(D(a,b,k)=\lfloor a/k \rfloor\lfloor b/k \rfloor\)。
设\(F(a,b)\)表示\(x\le a,y\le b\)且\(x,y\)互质的二元组有多少对,由容斥原理可得:
\]
上式表示没有限制的是\(D(a,b,1)\),减去公因数至少有一个质因子的\(D(a,b,p)\),加上减重复了的。以此类推,\(D(a,b,i)\)的系数恰好就是Mobius函数。
另外\(D(a,b,i)\)在\(\forall i \in [x,\min(\lfloor a/\lfloor a/x \rfloor \rfloor,\lfloor b/\lfloor b/x \rfloor \rfloor)]\)的值都相等,可以整除分块。那么预处理出Mobius函数的前缀和,就可直接累加这一段的答案。时间复杂度\(O(N \log \log N +N( \sqrt{a}+\sqrt{b}))\)。
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;
rg char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch))
data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x){
return x=read<T>();
}
typedef long long ll;
co int N=5e4+1;
int miu[N];
bool v[N];
void Zap(){
int a,b,k,ans=0;
read(a),read(b),read(k);
a/=k,b/=k;
if(a>b) std::swap(a,b);
for(int x=1,gx;x<=a;x=gx+1){
gx=std::min(a/(a/x),b/(b/x));
ans+=(miu[gx]-miu[x-1])*(a/x)*(b/x);
}
printf("%d\n",ans);
}
int main(){
// freopen(".in","r",stdin),freopen(".out","w",stdout);
for(int i=1;i<N;++i) miu[i]=1,v[i]=0;
for(int i=2;i<N;++i){
if(v[i]) continue;
miu[i]=-1;
for(int j=2*i;j<N;j+=i){
v[j]=1;
if(j/i%i==0) miu[j]=0;
else miu[j]*=-1;
}
}
for(int i=1;i<N;++i) miu[i]+=miu[i-1];
int n=read<int>();
while(n--) Zap();
return 0;
}
再分析
重温了一遍洛谷网课上AmberFrame的ppt。
=\sum_{x=1}^{\lfloor a/k \rfloor} \sum_{y=1}^{\lfloor b/k \rfloor} [\gcd(x,y)=1] \\
=\sum_{x=1}^{\lfloor a/k \rfloor} \sum_{y=1}^{\lfloor b/k \rfloor} \sum_{d|x \wedge d|y} \mu(d) \\
=\sum_{d=1}^{\lfloor a/k \rfloor} \lfloor \frac{a}{kd} \rfloor \lfloor \frac{b}{kd} \rfloor
\]
Devu and Flowers
Devu wants to decorate his garden with flowers. He has purchased n boxes, where the i-th box contains fi flowers. All flowers in a single box are of the same color (hence they are indistinguishable). Also, no two boxes have flowers of the same color.
Now Devu wants to select exactly s flowers from the boxes to decorate his garden. Devu would like to know, in how many different ways can he select the flowers from each box? Since this number may be very large, he asks you to find the number modulo (109 + 7).
Devu considers two ways different if there is at least one box from which different number of flowers are selected in these two ways.
Input
The first line of input contains two space-separated integers n and s (1 ≤ n ≤ 20, 0 ≤ s ≤ 1014).
The second line contains n space-separated integers f1, f2, … fn (0 ≤ fi ≤ 1012).
Output
Output a single integer — the number of ways in which Devu can select the flowers modulo (109 + 7).
Sample test(s)
input
2 3
1 3
1
2
2 3
1 3
output
2
1
2
input
2 4
2 2
1
2
2 4
2 2
output
1
1
1
input
3 5
1 3 2
1
2
3 5
1 3 2
output
3
1
3
Note
Sample 1. There are two ways of selecting 3 flowers: {1, 2} and {0, 3}.
Sample 2. There is only one way of selecting 4 flowers: {2, 2}.
Sample 3. There are three ways of selecting 5 flowers: {1, 2, 2}, {0, 3, 2}, and {1, 3, 1}.
分析
多重集组合问题。根据结论,答案为
\]
由于N很小,所以直接枚举子集即可。算组合数的时候用for
循环算。时间复杂度\(O(2^N N)\)
#include<bits/stdc++.h>
#define rg register
#define il inline
#define co const
template<class T>il T read(){
rg T data=0,w=1;
rg char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') w=-1;
ch=getchar();
}
while(isdigit(ch))
data=data*10+ch-'0',ch=getchar();
return data*w;
}
template<class T>il T read(rg T&x){
return x=read<T>();
}
typedef long long ll;
co int mod=1e9+7;
ll a[22],m,ans=0;
int inv[22],n;
int power(int a,int b){
int c=1;
for(;b;b>>=1){
if(b&1) c=(ll)c*a%mod;
a=(ll)a*a%mod;
}
return c;
}
int C(ll y,int x){
if(y<0||x<0||y<x) return 0;
y%=mod;
if(y==0||x==0) return 1;
int ans=1;
for(int i=0;i<x;++i)
ans=(ll)ans*(y-i)%mod;
for(int i=1;i<=x;++i)
ans=(ll)ans*inv[i]%mod;
return ans;
}
int main(){
// freopen(".in","r",stdin),freopen(".out","w",stdout);
for(int i=1;i<=20;++i) inv[i]=power(i,mod-2);
read(n),read(m);
for(int i=0;i<n;++i) read(a[i]);
for(int x=0;x<1<<n;++x){
ll t=n+m;
int p=0;
for(int i=0;i<n;++i)
if(x>>i&1) ++p,t-=a[i];
t-=p+1;
if(p&1) ans=(ans-C(t,n-1))%mod;
else ans=(ans+C(t,n-1))%mod;
}
printf("%lld\n",(ans+mod)%mod);
return 0;
}
BZOJ1101 [POI2007]Zap 和 CF451E Devu and Flowers的更多相关文章
- [BZOJ1101][POI2007]Zap
[BZOJ1101][POI2007]Zap 试题描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd ...
- BZOJ1101 POI2007 Zap 【莫比乌斯反演】
BZOJ1101 POI2007 Zap Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b, ...
- CF451E Devu and Flowers 解题报告
CF451E Devu and Flowers 题意: \(Devu\)有\(N\)个盒子,第\(i\)个盒子中有\(c_i\)枝花.同一个盒子内的花颜色相同,不同盒子的花颜色不同.\(Devu\)要 ...
- CF451E Devu and Flowers(容斥)
CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公 ...
- CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)
Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...
- BZOJ1101: [POI2007]Zap(莫比乌斯反演)
1101: [POI2007]Zap Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2951 Solved: 1293[Submit][Status ...
- Bzoj1101: [POI2007]Zap 莫比乌斯反演+整除分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 莫比乌斯反演 1101: [POI2007]Zap 设 \(f(i)\) 表示 \(( ...
- CF451E Devu and Flowers(组合数)
题目描述 Devu想用花去装饰他的花园,他已经购买了n个箱子,第i个箱子有fi朵花,在同一个的箱子里的所有花是同种颜色的(所以它们没有任何其他特征).另外,不存在两个箱子中的花是相同颜色的. 现在De ...
- 【莫比乌斯反演】BZOJ1101 [POI2007]zap
Description 回答T组询问,有多少组gcd(x,y)=d,x<=a, y<=b.T, a, b<=4e5. Solution 显然对于gcd=d的,应该把a/d b/d,然 ...
随机推荐
- eNSP配置基本与高级访问控制列表
首先我们进行基本的acl控制 拓扑图如下所示 首先我们对路由器进行基本ip配置 并在路由器上设置ospf协议 添加相邻的网段 在路由器上运行了ospf协议后 使用display ip route-ta ...
- mysql 排除系统库的全部备份
前言: 有些时候,我们要对数据库进行备份的时候,由于GTID的缘故,导出系统库后,再次导入其他环境的数据库时,就会出问题.所以,我们需要排掉一些系统库,排除GTID对于数据库迁移的影响. 方法: ...
- tp5功能模块添加与调试
在原先完善的功能基础上添加比如导出列表为excel ,一下子把所有属性写全了,出了问题,不好查找问题在哪? 所以遇到这种问题,需要最简单的测试.比如新建一个mysql表内就放一列一行数据.减少代码量, ...
- URI和URL的关系与区别
首先给大家举个例子,有一家公司的总经理,某天,给了我一张名片,上面写了他的头衔,北京XXX公司总经理 张三,还有他的办公室地址,北京市海淀区长安街35号北京XXX公司总经理办公室,那么,我以后给我的朋 ...
- 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
package com.hadoop.hdfs; import org.apache.hadoop.yarn.webapp.hamlet.Hamlet; import org.junit.Test; ...
- Python-17-反射
一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- 软件包 javax.naming了解
Context 此接口表示一个命名上下文,它由一组名称到对象的绑定组成. Name Name 接口表示一个一般名称,即一个有序的组件序列. NameParser 此接口用于解析取自分层的名称空间 ...
- 数据库去空格 去table 去回车符号 去重
1 update bd_prod_cate c set c.cate_name = replace(c.cate_name,chr(9),'')//去掉tab符号的 2 update bd_prod_ ...
- Codeforces-975C - Valhalla Siege 前缀和 思维
C. Valhalla Siege time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Flask无法访问(127.0.0.1:5000)的问题解决方法
Flask默认开启的ip地址是:http://127.0.0.1:5000/ 但在运行时可能存在无法访问的问题,特别是当我们在linux服务器上搭建flask时,此时需要将代码修改如下: app.ru ...