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\)互质的二元组有多少对,由容斥原理可得:

\[F(a,b)=\sum_{i=1}^{\min(a,b)} \mu (i)*D(a,b,i)
\]

上式表示没有限制的是\(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}^a \sum_{y=1}^b [\gcd(x,y)=k] \\
=\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}.

分析

多重集组合问题。根据结论,答案为

\[\binom{N+M-1}{N-1}-\sum_{i=1}^N \binom{N+M-A_i-2}{N-1} + \sum_{1 \le i < J \le N} \binom{N+M-A_i-A_j-3}{N-1}-\dots+(-1)^N \binom{N+M-\sum_{i=1}^N A_i -(N+1)}{N-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的更多相关文章

  1. [BZOJ1101][POI2007]Zap

    [BZOJ1101][POI2007]Zap 试题描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd ...

  2. BZOJ1101 POI2007 Zap 【莫比乌斯反演】

    BZOJ1101 POI2007 Zap Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b, ...

  3. CF451E Devu and Flowers 解题报告

    CF451E Devu and Flowers 题意: \(Devu\)有\(N\)个盒子,第\(i\)个盒子中有\(c_i\)枝花.同一个盒子内的花颜色相同,不同盒子的花颜色不同.\(Devu\)要 ...

  4. CF451E Devu and Flowers(容斥)

    CF451E Devu and Flowers(容斥) 题目大意 \(n\)种花每种\(f_i\)个,求选出\(s\)朵花的方案.不一定每种花都要选到. \(n\le 20\) 解法 利用可重组合的公 ...

  5. CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元)

    Codeforces Round #258 (Div. 2) Devu and Flowers E. Devu and Flowers time limit per test 4 seconds me ...

  6. BZOJ1101: [POI2007]Zap(莫比乌斯反演)

    1101: [POI2007]Zap Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2951  Solved: 1293[Submit][Status ...

  7. Bzoj1101: [POI2007]Zap 莫比乌斯反演+整除分块

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1101 莫比乌斯反演 1101: [POI2007]Zap 设 \(f(i)\) 表示 \(( ...

  8. CF451E Devu and Flowers(组合数)

    题目描述 Devu想用花去装饰他的花园,他已经购买了n个箱子,第i个箱子有fi朵花,在同一个的箱子里的所有花是同种颜色的(所以它们没有任何其他特征).另外,不存在两个箱子中的花是相同颜色的. 现在De ...

  9. 【莫比乌斯反演】BZOJ1101 [POI2007]zap

    Description 回答T组询问,有多少组gcd(x,y)=d,x<=a, y<=b.T, a, b<=4e5. Solution 显然对于gcd=d的,应该把a/d b/d,然 ...

随机推荐

  1. git push时出现大文件的处理方法

    最近在提交项目时出现报错 文件限制只能100M,但是里面有个文件202M,超过了码云的限制. 所以顺手就把这个文件删除了 然后发现还是同样的报错,反复检查目录还是不行,找了资料说,需要git rm 命 ...

  2. [Asp.Net Core] - 设置 Syncfusion / RichTextEditor 移除超链接及高度自适应 的方法

    背景 使用 Syncfusion / RichTextEditor 对录入后的信息进行展示:1. 希望内容高度自适应.2. 希望禁用原文中的超链接.   实现 <div class=" ...

  3. MAC帧封装

    通过控制台输入一段文字,输出MAC帧的2进制和16进制的字符串,主要是求FCS.这里只考虑单帧的情况,即只考虑输入数据在1字节~1500字节之间的情况,对于更长的数据暂不考虑. 1.MAC帧基本格式 ...

  4. PAT甲级题分类汇编——线性

    本文为PAT甲级分类汇编系列文章. 线性类,指线性时间复杂度可以完成的题.在1051到1100中,有7道: 题号 标题 分数 大意 时间 1054 The Dominant Color 20 寻找出现 ...

  5. (转)FFmpeg架构之I/O模块分析

    注意:这篇转载的文章比较早,写得很清晰,但是新版的ffmpeg的很多数据结构的名字已经改了.因此只能作参考.(例如ByteIOContext已经改名为AVIOContext) 1概述 ffmpeg项目 ...

  6. Java8新特性 - 新时间和日期 API

    本地时间和时间戳 主要方法: now:静态方法,根据当前时间创建对象 of:静态方法,根据指定日期/时间创建对象 plusDays,plusWeeks,plusMonths,plusYears:向当前 ...

  7. python练习:异常

    异常习题: 一 编写with操作类Fileinfo(),定义__enter__和__exit__方法.完成功能: 1.1 在__enter__方法里打开Fileinfo(filename),并且返回f ...

  8. C#用户控件实战01_CSS布局

    很多应用系统的主页布局,一般采用如下案例所示布局较多,如下图的CSS布局框架,上.中.下,接下来我们演示,在C#中实现如下的业务架构布局. 代码范例: 在<body></body&g ...

  9. Sublim text 3 同步 eclipse 快捷键

    首选项>按键绑定>用户 配置内容(注意为JSON格式!) [ { "keys": ["shift+enter"], "command&qu ...

  10. python入门-windows下python环境搭建

    1. 下载安装包 选择executable版,根据自己电脑的操作系统选择是32位还是64为. python3.6-64位下载 python3.6-32位下载 2. 安装python 下载之后是这样的 ...