显然存在方案的数一定是L的因数,考虑对其因子预处理答案,O(1)回答。

  考虑每个质因子,设其在g中有x个,l中有y个,则要求所有选中的数该质因子个数都在[x,y]中,且存在数的质因子个数为x、y。对于后一个限制,显然可以简单地容斥,即[x,y]-[x+1,y]-[x,y-1]+[x+1,y-1],枚举这个至多是48的,这个取最大值时因子个数是28。暴力枚举数数即可。复杂度总之O(能过)。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define P 1000000007
#define ll long long
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,g,l,u,m,prime[],cnt[][],d[],ans[],p[][],q[][],a[],tot,t,sum;
int ksm(int a,int k)
{
int s=;
for (;k;k>>=,a=1ll*a*a%P) if (k&) s=1ll*s*a%P;
return s;
}
void get(int k,int s)
{
if (k>t) {sum++;return;}
ll x=ksm(prime[k],cnt[][k]);
for (int i=cnt[][k];i<=cnt[][k];i++)
{
if (s*x<=n) get(k+,s*x);else break;
x=1ll*x*prime[k];
}
}
void build(int k,int s)
{
if (k>t)
{
p[++tot][]=s;
for (int i=;i<=t;i++) p[tot][i]=a[i];
return;
}
ll x=ksm(prime[k],cnt[][k]);
for (int i=cnt[][k];i<=cnt[][k];i++)
{
a[k]=i;
if (s*x<=n) build(k+,s*x);else break;
x=1ll*x*prime[k];
}
}
void calc(int op)
{
//for (int i=1;i<=t;i++) cout<<prime[i]<<' '<<cnt[0][i]<<' '<<cnt[1][i]<<endl;cout<<endl;
sum=;get(,);
for (int i=;i<=tot;i++)
{
bool flag=;
for (int j=;j<=t;j++)
if (p[i][j]<cnt[][j]||p[i][j]>cnt[][j]) {flag=;break;}
if (flag)
{
ans[i]+=op*ksm(,sum-);
if (ans[i]<) ans[i]+=P;if (ans[i]>=P) ans[i]-=P;
}
}
}
void dfs(int k,int op)
{
if (k>t) {calc(op);return;}
dfs(k+,op);
cnt[][k]++;dfs(k+,-op);
cnt[][k]--;dfs(k+,op);
cnt[][k]--;dfs(k+,-op);
cnt[][k]++;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5019.in","r",stdin);
freopen("bzoj5019.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),g=read(),l=read(),m=read();
if (l%g) {for (int i=;i<=m;i++) printf("0\n");return ;}
u=l;
for (int i=;i*i<=u;i++)
if (u%i==)
{
prime[++t]=i,cnt[][t]=;u/=i;
while (u%i==) cnt[][t]++,u/=i;
}
if (u>) prime[++t]=u,cnt[][t]=;
u=g;
for (int i=;i<=t;i++)
while (u%prime[i]==) u/=prime[i],cnt[][i]++;
build(,);
for (int i=;i<=tot;i++) d[i]=p[i][];
sort(d+,d+tot+);
for (int i=;i<=tot;i++)
for (int j=;j<=t;j++)
q[i][j]=p[i][j];
for (int i=;i<=tot;i++)
{
int x=lower_bound(d+,d+tot+,q[i][])-d;
for (int j=;j<=t;j++) p[x][j]=q[i][j];
}
dfs(,);
while (m--)
{
int x=read(),y=lower_bound(d+,d+tot+,x)-d;
if (d[y]!=x) {printf("0\n");continue;}
else printf("%d\n",ans[y]);
}
return ;
}

BZOJ5019 SNOI2017遗失的答案(容斥原理)的更多相关文章

  1. BZOJ5019[Snoi2017]遗失的答案——FWT+状压DP

    题目描述 小皮球在计算出答案之后,买了一堆皮肤,他心里很开心,但是一不小心,就忘记自己买了哪些皮肤了.==|||万 幸的是,他还记得他把所有皮肤按照1-N来编号,他买来的那些皮肤的编号(他至少买了一款 ...

  2. bzoj5019: [Snoi2017]遗失的答案

    Description 小皮球在计算出答案之后,买了一堆皮肤,他心里很开心,但是一不小心,就忘记自己买了哪些皮肤了.==|||万 幸的是,他还记得他把所有皮肤按照1-N来编号,他买来的那些皮肤的编号( ...

  3. 【BZOJ5019】[SNOI2017]遗失的答案(FWT,动态规划)

    [BZOJ5019][SNOI2017]遗失的答案(FWT,动态规划) 题面 BZOJ 题解 发现\(10^8\)最多分解为不超过\(8\)个本质不同质数的乘积. 而\(gcd\)和\(lcm\)分别 ...

  4. bzoj 5019: [Snoi2017]遗失的答案【dp+FWT】

    满足GL的组合一定包含GL每个质因数最大次幂个最小次幂,并且能做限制这些数不会超过600个 然后质因数最多8个,所以可以状压f[s1][s2]为选s1集合满足最大限制选s2集合满足最小限制 dfs一下 ...

  5. bzoj 5019 [Snoi2017]遗失的答案

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5019 题解 如果L不是G的倍数 答案为0 下面考虑G|L的情况 将G,L质因数分解 设$L= ...

  6. LOJ2257 SNOI2017 遗失的答案 容斥、高维前缀和

    传送门 数字最小公倍数为\(L\)的充分条件是所有数都是\(L\)的约数,而\(10^8\)内最多约数的数的约数也只有\(768\)个.所以我们先暴力找到所有满足是\(L\)的约数.\(G\)的倍数的 ...

  7. luogu P5366 [SNOI2017]遗失的答案

    luogu 首先gcd为\(G\),lcm为\(L\),有可能出现的数(指同时是\(G\)的因数以及是\(L\)的倍数)可以发现只有几百个.如果选出的数要能取到gcd,那么对于每种质因子,都要有一个数 ...

  8. 洛谷$P5366\ [SNOI2017]$遗失的答案 数论+$dp$

    正解:数论$dp$ 解题报告: 传送门$QwQ$ 考虑先质因数分解.所以$G$就相当于所有系数取$min$,$L$就相当于所有系数取$max$ 这时候考虑,因为数据范围是$1e8$,$1e8$内最多有 ...

  9. [SNOI2017]遗失的答案

    题目 首先\(G,L\)肯定会满足\(G|L\),否则直接全部输出\(0\) 之后我们考虑一下能用到的质因数最多只有\(8\)个 同时我们能选择的数\(x\)肯定是\(L\)的约数,还得是\(G\)的 ...

随机推荐

  1. POJ1127 Jack Straws

    给你一些线段,求出哪些线段是相连的,哪些是不相连的.相连包括间接相连,即这两条线段本身不直接相连,而是通过其它线段的连接而间接相连. 线段相交+并查集 这里主要说如何判断线段相交:快速排斥试验+跨立试 ...

  2. DB2创建function(二)

    DB2创建function(一),介绍将function内容作为字段值,或做为一个where条件的情况. DB2创建function(二),介绍返回的内容为一个集合的情况.调用结果集的示例如下: se ...

  3. Python、pywin32&pycharm安装记录

    未完待续-- Python 下载安装 1.百度搜索Python,进入官网,download,下载相应版本 [因为我们需要用到的是Windows下的解释器,所以在Operating System中可以选 ...

  4. Luogu P1198 [JSOI2008]最大数

    我会用高级(???)的单调栈来打这道题吗? 线段树即可水过. 假设这个数列刚开始所有数都是0,然后我们每次只要进行一个点的修改和区间求和即可. 这不就是 线段树大法. 只要用一个len记录一下当前数列 ...

  5. LoRa---官方例程移植

    SX1278芯片上移植Semtech官方PING-PONG例程 移植环境:keil5.20 硬件平台:stm32f051+sx1278 1.下载源码:Semtech官网下载最新例程链接:http:// ...

  6. scala学习——(1)scala基础(上)

    scala> val x = 1 x: Int = 1 一.值与变量 值(val):赋值后不可变 val值名称:类型 = XXX 变量(var):赋值后可以改变  var变量名称:类型 = XX ...

  7. springboot项目生成jar包(带静态资源)方法

    [Maven]在pom.xml文件中使用resources插件的小作用 不过war包比较实用,毕竟独立的tomcat比较好控制

  8. 基于Vue手写一个下拉刷新

    当然不乏有很多下拉刷新的插件可以直接使用,但是自定义程度不强,大部分都只能改改文字,很难满足设计师的创意,譬如淘宝和京东首页那种效果,就需要自己花心思倒腾了,最近刚好有这种需求,做完了稍微总结一下,具 ...

  9. NetBeans的(默认)快捷键

    NetBeans的(默认)快捷键 1.完成代码:ctrl+\ //任何地方按下此组合键,均会提示相应的参考字段:  2.错误提示:alt + enter //顾名思义,当系统报错时,按下此组合可以查看 ...

  10. ESLint 规则详解(二)

    接上篇 ESLint 规则详解(一) 前端界大神 Nicholas C. Zakas 在 2013 年开发的 ESLint,极大地方便了大家对 Javascript 代码进行代码规范检查.这个工具包含 ...