显然存在方案的数一定是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(能过)。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<algorithm>
  7. using namespace std;
  8. #define P 1000000007
  9. #define ll long long
  10. int read()
  11. {
  12. int x=,f=;char c=getchar();
  13. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  14. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  15. return x*f;
  16. }
  17. int n,g,l,u,m,prime[],cnt[][],d[],ans[],p[][],q[][],a[],tot,t,sum;
  18. int ksm(int a,int k)
  19. {
  20. int s=;
  21. for (;k;k>>=,a=1ll*a*a%P) if (k&) s=1ll*s*a%P;
  22. return s;
  23. }
  24. void get(int k,int s)
  25. {
  26. if (k>t) {sum++;return;}
  27. ll x=ksm(prime[k],cnt[][k]);
  28. for (int i=cnt[][k];i<=cnt[][k];i++)
  29. {
  30. if (s*x<=n) get(k+,s*x);else break;
  31. x=1ll*x*prime[k];
  32. }
  33. }
  34. void build(int k,int s)
  35. {
  36. if (k>t)
  37. {
  38. p[++tot][]=s;
  39. for (int i=;i<=t;i++) p[tot][i]=a[i];
  40. return;
  41. }
  42. ll x=ksm(prime[k],cnt[][k]);
  43. for (int i=cnt[][k];i<=cnt[][k];i++)
  44. {
  45. a[k]=i;
  46. if (s*x<=n) build(k+,s*x);else break;
  47. x=1ll*x*prime[k];
  48. }
  49. }
  50. void calc(int op)
  51. {
  52. //for (int i=1;i<=t;i++) cout<<prime[i]<<' '<<cnt[0][i]<<' '<<cnt[1][i]<<endl;cout<<endl;
  53. sum=;get(,);
  54. for (int i=;i<=tot;i++)
  55. {
  56. bool flag=;
  57. for (int j=;j<=t;j++)
  58. if (p[i][j]<cnt[][j]||p[i][j]>cnt[][j]) {flag=;break;}
  59. if (flag)
  60. {
  61. ans[i]+=op*ksm(,sum-);
  62. if (ans[i]<) ans[i]+=P;if (ans[i]>=P) ans[i]-=P;
  63. }
  64. }
  65. }
  66. void dfs(int k,int op)
  67. {
  68. if (k>t) {calc(op);return;}
  69. dfs(k+,op);
  70. cnt[][k]++;dfs(k+,-op);
  71. cnt[][k]--;dfs(k+,op);
  72. cnt[][k]--;dfs(k+,-op);
  73. cnt[][k]++;
  74. }
  75. int main()
  76. {
  77. #ifndef ONLINE_JUDGE
  78. freopen("bzoj5019.in","r",stdin);
  79. freopen("bzoj5019.out","w",stdout);
  80. const char LL[]="%I64d\n";
  81. #else
  82. const char LL[]="%lld\n";
  83. #endif
  84. n=read(),g=read(),l=read(),m=read();
  85. if (l%g) {for (int i=;i<=m;i++) printf("0\n");return ;}
  86. u=l;
  87. for (int i=;i*i<=u;i++)
  88. if (u%i==)
  89. {
  90. prime[++t]=i,cnt[][t]=;u/=i;
  91. while (u%i==) cnt[][t]++,u/=i;
  92. }
  93. if (u>) prime[++t]=u,cnt[][t]=;
  94. u=g;
  95. for (int i=;i<=t;i++)
  96. while (u%prime[i]==) u/=prime[i],cnt[][i]++;
  97. build(,);
  98. for (int i=;i<=tot;i++) d[i]=p[i][];
  99. sort(d+,d+tot+);
  100. for (int i=;i<=tot;i++)
  101. for (int j=;j<=t;j++)
  102. q[i][j]=p[i][j];
  103. for (int i=;i<=tot;i++)
  104. {
  105. int x=lower_bound(d+,d+tot+,q[i][])-d;
  106. for (int j=;j<=t;j++) p[x][j]=q[i][j];
  107. }
  108. dfs(,);
  109. while (m--)
  110. {
  111. int x=read(),y=lower_bound(d+,d+tot+,x)-d;
  112. if (d[y]!=x) {printf("0\n");continue;}
  113. else printf("%d\n",ans[y]);
  114. }
  115. return ;
  116. }

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. P2014 选课

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

  2. pstack 故障排除思路

    1.先使用top看下CPU占用高的进程,找出进程的进程ID(pid): 查看方法:top 2.根据进程ID(pid)查看是进程的那些线程占用CPU高. 查看方法:top -Hp pid3.使用psta ...

  3. 四,ESP8266 TCP服务器(基于Lua脚本语言)

    我要赶时间赶紧写完所有的内容....朋友的东西答应的还没做完呢!!!!!!!没想到又来了新的事情,,....... 配置模块作为TCP服务器然后呢咱们连接服务器发指令控制LED亮灭 控制的指令呢咱就配 ...

  4. 创建一个目录的软连接ln -s和打印当前目录pwd的一个知识点

    创建一个目录的软连接,比如我在家目录下创建一个/data/www/的软连接,如下 # cd ~ # ln -s /data/www hehe       #这里一定要注意顺序哈哈 然后当我进入hehe ...

  5. odoo方法

    一. 类似于前面有个_ 的方法,格式是如下def _getdlvqty(self, cr, uid, ids, field_names, args, context=None): def _get_p ...

  6. 【stylus】stylus在webstrom中的识别

    <style lang="stylus" rel="stylesheet/stylus"> @import './common/stylus/mix ...

  7. 使用Gzip压缩数据,加快页面访问速度

                 在返回的json数据量大时,启用Gzip压缩,可以提高传输效率.下面为Gzip压缩对json字符串压缩并输出到页面的代码. 一.代码 /** 向浏览器输出字符串响应数据,启用 ...

  8. Android开发——Fragment知识整理(一)

    0.  前言 Fragment,顾名思义是片段的意思,可以把Fragment当成Activity的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成.Fragment需要被嵌 ...

  9. [CTSC2006]歌唱王国

    [CTSC2006]歌唱王国 Tags:题解 题意 链接:在空串后不断随机添加字符,直到出现串\(S_i\)为止.求最终串的期望长度.\(\sum |S_i|\le 5*10^6\) 题解 以下内容来 ...

  10. 【最详细最完整】在Linux 下如何打包免安装的QT程序?

    在Linux 下如何打包免安装的QT程序? 版权声明:嵌入式linux相关的文章是我的学习笔记,基于Exynos 4412开发板,一部分内容是总结,一部分是查资料所得,大家可以自由转载,但请注明出处! ...