description

小皮球在计算出答案之后,买了一堆皮肤,他心里很开心,但是一不小心,就忘记自己买了哪些皮肤了。= =|||
万幸的是,他还记得他把所有皮肤按照 1∼N 来编号,他买来的那些皮肤的编号(他至少买了一款皮肤),最大公约数是 G,最小公倍数是 L。
现在,有 Q 组询问,每组询问输入一个数字 X,请你告诉小皮球,有多少种合法的购买方案中,购买了皮肤 X?
因为答案太大了,所以你只需要输出答案 mod1000000007 即可。

输入格式
第一行,三个数字 N,G,L,如题意所示。
第二行,一个数字 Q,表示询问个数。
第三行,Q 个数字,表示每个询问所问的 X

输出格式
对于每一组询问,在一行中单独输出一个整数,表示这个询问的答案。

样例
Input
5 1 30
5
1 2 3 4 5
Output
1
2
2
0
2

数据范围与提示
30%的数据:N≤20
50% 的数据:N≤1000
70% 的数据:N≤100000
100% 的数据:N,G,L≤108,Q≤105,1≤X≤108N,G,L≤10^8,Q≤10^5,1≤X≤10^8N,G,L≤108,Q≤105,1≤X≤108

solution

先不考虑强制选xxx的情况

先把n/G,L/Gn/G,L/Gn/G,L/G,转化为求gcd=1,lcm=L/Ggcd=1,lcm=L/Ggcd=1,lcm=L/G的方案数
因为L≤1e8L\le 1e8L≤1e8,分解质因子即不超过888个
这么小考虑状压

如何保证gcd=1gcd=1gcd=1
证明某个被选择的皮肤有一个LLL的质因子对应的指数为000,即不含该质因子
如何保证lcm=Llcm=Llcm=L
证明某个被选择的皮肤有一个LLL的质因子对应的指数与LLL相同
LLL的每一个质因子都有某个皮肤指数与之分解后相同
且所有的都不能超过

那么状压分为两类
前一半表示质因子的指数是否为000,后一半表示质因子的指数是否达到LLL上界

显然有些皮肤分解后对应的状态是一样的,统计在一起即可
状态数似乎650650650内

现在加上xxx强制入选的要求,就单列出来
设fff表示前缀积,ggg表示后缀积
ans[i]=val[i→S′]∗∑Sf[i−1][S]×g[i+1][S]ans[i]=val[i\rightarrow S']*\sum_Sf[i-1][S]\times g[i+1][S]ans[i]=val[i→S′]∗S∑​f[i−1][S]×g[i+1][S]
发现可以将f,gf,gf,g用FWTorFWT_{or}FWTor​卷起来

具体可看代码

code

代码经过各种取模优化,快读优化,吸氧才堪堪跑过

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define mod 1000000007
vector < int > num;
int n, G, L, Q, N, cnt, tot;
int p[10], e[10];
int id[650], s[1 << 16], sum[650], ans[650];
int h[650][1 << 16], f[650][1 << 16], g[650][1 << 16];void read( int &x ) {x = 0; int f = 1; char s = getchar();while( s < '0' || s > '9' ) {if( s  == '-' ) f = -1;s = getchar();}while( '0' <= s && s <= '9' ) {x = ( x << 1 ) + ( x << 3 ) + ( s - '0' );s = getchar();}x *= f;
}int qkpow( int x, int y ) {int ans = 1;while( y ) {if( y & 1 ) ans = 1ll * ans * x % mod;x = 1ll * x * x % mod;y >>= 1;}return ans;
}void init( int x ) {for( int i = 2;i * i <= x;i ++ ) {if( x % i == 0 ) {p[++ tot] = i;while( x % i == 0 ) x /= i, e[tot] ++;}}if( x > 1 ) p[++ tot] = x, e[tot] = 1;
}int calc( int x ) {int S = 0;for( int i = 1;i <= tot;i ++ ) {int t = 0;while( x % p[i] == 0 ) x /= p[i], t ++;if( t == 0 ) S |= ( 1 << ( i - 1 ) );if( t == e[i] ) S |= ( 1 << ( i - 1 + tot ) );}return S;
}int add( int x, int y ) {x += y;if( x > mod ) return x - mod;return x;
}int sub( int x, int y ) {x -= y;if( x < 0 ) return x + mod;return x;
}void FWT_or( int *v, int f ) {for( int i = 1;i < N;i <<= 1 )for( int j = 0;j < N;j += ( i << 1 ) )for( int k = 0;k < i;k ++ )if( f == 1 ) v[j + k + i] = add( v[j + k + i], v[j + k] );else v[j + k + i] = sub( v[j + k + i], v[j + k] );
}int main() {read( n ), read( G ), read( L ), read( Q );if( L % G ) {while( Q -- ) {int x;read( x );printf( "0\n" );}return 0;}L /= G, n /= G, init( L );for( int i = 1;i <= n && i * i <= L;i ++ ) {if( L % i ) continue;num.push_back( i );if( L / i <= n && i * i != L )num.push_back( L / i );}for( int i = 0;i < num.size();i ++ )s[calc( num[i] )] ++;N = 1 << ( tot << 1 ); for( int i = 0;i < N;i ++ )if( s[i] ) id[++ cnt] = i, sum[cnt] = qkpow( 2, s[i] ) - 1;f[0][0] = g[cnt + 1][0] = 1;for( int i = 1;i <= cnt;i ++ )for( int S = 0;S < N;S ++ ) {f[i][S] = add( f[i][S], f[i - 1][S] );f[i][S | id[i]] = add( f[i][S | id[i]], 1ll * f[i - 1][S] * sum[i] % mod );}for( int i = cnt;i;i -- )for( int S = 0;S < N;S ++ ) {g[i][S] = add( g[i][S], g[i + 1][S] );g[i][S | id[i]] = add( g[i][S | id[i]], 1ll * g[i + 1][S] * sum[i] % mod );}for( int i = 0;i <= cnt;i ++ ) FWT_or( f[i], 1 );for( int i = 1;i <= cnt + 1;i ++ ) FWT_or( g[i], 1 );for( int i = 1;i <= cnt;i ++ )    for( int S = 0;S < N;S ++ )h[i][S] = 1ll * f[i - 1][S] * g[i + 1][S] % mod;for( int i = 1;i <= cnt;i ++ ) FWT_or( h[i], -1 );for( int i = 1;i <= cnt;i ++ ) {for( int S = 0;S < N;S ++ )if( ( S | id[i] ) == N - 1 )ans[i] = add( ans[i], h[i][S] );ans[i] = 1ll * ans[i] * qkpow( 2, s[id[i]] - 1 ) % mod;}while( Q -- ) {int x;read( x );if( x % G ) {printf( "0\n" );continue;}x /= G;if( L % x || x > n ) {printf( "0\n" );continue;}int p = lower_bound( id + 1, id + cnt + 1, calc( x ) ) - id;printf( "%d\n", ans[p] );}return 0;
}

[SNOI2017]遗失的答案 (FWT)相关推荐

  1. LuoguP5366 [SNOI2017]遗失的答案

    LuoguP5366 [SNOI2017]遗失的答案 题目描述 Solution 可以先简化问题,特判LLL不是GGG倍数的情况. 然后令n=⌊nG⌋n=\lfloor \frac{n}{G} \rf ...

  2. [SNOI2017]遗失的答案

    遗失的答案 题解 其实这题挺水的. 显然,当 G ∤ L G\not | \,\,\,L G​∣L时是无解的.我们可以先将小于 n n n的不是 G G G倍数的值全部舍去,只用管为 G G G倍 ...

  3. [SDOI2017]遗忘的集合

    题面 DP学得好好的为什么突然想起写多项式呢? 这要从几天前说起 一开始是看到一道FWT的DP([SNOI2017]遗失的答案) 然后在洛谷上搜 没有搜到 但是搜到了这个题 仔细一看 MTT+莫比乌斯 ...

  4. linux中的crontab文件位置,linux crontab 文件位置和日志位置

    一.文件位置 位置一般在/var/spool/cron/下,如果你是root用户,那下面有个root文件,建议日常备份,避免误删除导致crontab 文件丢失: 二.日志文件位置 默认情况下,cron ...

  5. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  6. 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...

  7. [转]信息安全相关理论题(三)

    21.静态分析是运行程序后进行调试? A. 对 B. 错 您的答案: 标准答案: B 22.安卓反编译后会出现$符号字节码表示是匿名内部类? A. 对 B. 错 您的答案: 标准答案: A 23.反编 ...

  8. 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. openlayers map获取全部feature_tf2.0基础-tf.data与tf.feature_column
  2. 让PyTorch更轻便,这款深度学习框架你值得拥有!在GitHub上斩获6.6k星
  3. IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期
  4. 公有/私有/保护继承、overload/overwrite/override之间的区别
  5. arm-none-linux-gnueabi,arm-none-eabi 与arm-eabi 区别 及 arm-none-linux-gnueabi安装
  6. boost::units模块实现测试数量之间的转换的测试程序
  7. AI:IPPR的数学表示-CNN稀疏结构进化(Mobile、xception、Shuffle、SE、Dilated、Deformable)
  8. 【华为HCNA】访问控制列表ACL实例配置
  9. 有效的Java第三版有哪些新功能?
  10. 途观l怎么使用_官宣!中型SUV质量最新排名出炉:汉兰达失前三,大众途观L上榜!...
  11. 从/etc/inetd.conf学习服务(4)
  12. Linux 简单架设防火墙路由器
  13. air文件打包成exe
  14. java 读取小数位数_java如何获取一个double的小数位数
  15. OSChina 周一乱弹 —— 妮儿还是把上衣穿上吧
  16. 联想小新pro16无法识别网卡MT7921的问题
  17. Python小项目-画机器猫中的战斗猫
  18. Python吴恩达深度学习作业22 -- Emoji表情情感分类器
  19. 福大软工 · 第十次作业 - 项目测评(团队)
  20. 1050: 平方和与立方和

热门文章

  1. 学习 Python 编程的 19 个资源
  2. 在鹅厂,我作为一个Java 程序员每天都在摸鱼!!!
  3. 快速修改HTML5,HTML5无刷新修改URL(示例代码)
  4. k8s滚动升级_k8s deployment 滚动更新
  5. matlab仿真习题,(MATlab仿真部分习题答案.doc
  6. gitee 从 拉取新分支到本地_Hexo博客详细教程(一)| 建立本地站点
  7. python 百度ai批量识别_Python基于百度AI的文字识别的示例
  8. python能做哪些客户端_Python 实现简单的客户端认证
  9. leetcode459. 重复的子字符串(KMP)
  10. 一文了解树在前端中的应用,掌握数据结构中树的生命线