【问题描述】

给出 n 个数 a1,a2,...,an, 询问有多少个三元组(i, j, k)满足以下两个条件:
1、 i < j < k; 2、 ai*aj*ak 是 p 的倍数。

【输入格式】

第一行两个数 n, p。
接下来一行 n 个数。

【输出格式】

一行一个数表示答案。

【输入样例 1】

4 100

4 5 2 25

【输出样例 1】

2

【输入样例 2】

12 1

1 1 1 1 1 1 1 1 1 1 1 1

【输出样例 2】

220

【输入样例 3】

27 36

269 154 94 221 171 154 50 210 258 358 121 159 8 47 290 125 291 293 338 248 295 160 268

227 99 4 27

【输出样例 3】

145

【数据范围与约定】

对于 30%的数据: n <= 100。

对于 60%的数据: n <= 2000, 1 <= ai <= 10^8。

对于 100%的数据: n <= 30000, 1 <= ai <= 10^8, 1 <= p <= 10^6。


第一眼 ,数论题

第二眼 ,数据结构来维护

第三眼 ,可以质因数分解?

...

第N眼 靠,怎么做啊?

经过不断的磕磕碰碰,终于往动态规划上想了想,(好,就决定是你了)

前面都是废话

下面是正经部分:

  • f[i][j],表示此时我取了1~3元集,与p的最大公约数为j时的方案数。
  • 最外层循环i,枚举所有的a[i]
  • 倒序从3到1枚举j(想要在自己的身上跳舞就要从身子下方更新上来,不能用脚更新了腰,又把更新后的腰来更新头SMG..)总之如果正序来,会使得已经更新后的值作为前一个a[i-1]的DP值又更新了一次此时的a[i]的DP值。
  • 然后用a[i]与p的GCD与枚举的GCD相乘后的结果再与P求一次GCD, 所以此时被更新的状态就是最后求出来的GCD了。
  • 当然如果当i==1时,就不需要枚举之前的因子了 直接 f[1][GCD(a[i],p)]++ 就可以了。

几个注意事项:

  • 预处理出所有a[i]与p的GCD(不然中间循环算太多次GCD会超时的)
  • 看起来DP数组的第二位要开到 p(1000000), 其实不用,我们给p的所有因子编号,开到2*sqrt(p)即可。
 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm> #define For(i,a,b) for(register llg i=a;i<=b;++i)
#define Dwn(i,a,b) for(register llg i=a;i>=b;--i)
#define llg long long
using namespace std;
const llg N=3e4+;
llg f[][];
llg yz[N],tot=;
llg a[N],p,n;
llg px[];
llg fp[N];
inline void read(llg &v){
v=;
char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')v=v*+c-'',c=getchar();
}
void Dv(llg x){
llg qx=sqrt(x);
For(i,,qx){
if(x%i==){
llg y1=i;
llg y2=x/i;
if(y1!=y2){
yz[++tot]=y1; px[y1]=tot;
yz[++tot]=y2; px[y2]=tot;
}else{
yz[++tot]=y1; px[y1]=tot;
}
}
}
} llg Gcd (llg x,llg y){
while(){
llg yy=x%y;
x=y; y=yy;
if(yy==)return x;
}
} int main(){
freopen("divide.in","r",stdin);
freopen("divide.out","w",stdout);
read(n); read(p);
For(i,,n) read(a[i]);
Dv(p);
For(i,,n) fp[i]=Gcd(a[i],p);
For(i,,n){
Dwn(j,,){
llg Gx;
if(j==){
Gx=fp[i];
f[][px[Gx]]+=;
continue;
}
For(k,,tot){
if(f[j-][k]==)continue;
Gx=Gcd(yz[k]*fp[i],p);
f[j][px[Gx]]+=f[j-][k];
}
}
} cout<<f[][px[p]]<<endl; fclose(stdin); fclose(stdout);
return ;
}

【NOI广东省选模拟赛】割的更多相关文章

  1. NOI.AC NOIP模拟赛 第五场 游记

    NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...

  2. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  3. NOI.AC NOIP模拟赛 第二场 补记

    NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...

  4. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  5. NOI.AC NOIP模拟赛 第四场 补记

    NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...

  6. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  7. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  8. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  9. 3.28 省选模拟赛 染色 LCT+线段树

    发现和SDOI2017树点涂色差不多 但是当时这道题模拟赛的时候不会写 赛后也没及时订正 所以这场模拟赛的这道题虽然秒想到了LCT和线段树但是最终还是只是打了暴力. 痛定思痛 还是要把这道题给补了. ...

随机推荐

  1. mysql学习之基础知识

    一.什么是数据库 一般而言,数据库(Database)是按照数据结构来组织.存储和管理数据的仓库.我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢.所以,使用关系型数据库管理系统(RDB ...

  2. 九度OJ 1138:进制转换 (进制转换)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2388 解决:935 题目描述: 将一个长度最多为30位数字的十进制非负整数转换为二进制数输出. 输入: 多组数据,每行为一个长度不超过30 ...

  3. 8.JS数据类型

    ① 数据类型:字符串,数字,布尔,数组,对象,Null,Undefined ② JavaScript拥有动态类型.这意味着相同的变量可用作不同的类型: 实例 var x:   //x为undefine ...

  4. IE6 PNG图片不透明的解决方案-tinypng

    https://tinypng.com/ 把图片上传上去,就能处理这个问题啦. 纠正一下 再也不用把png图片一个个拖到TinyPNG进行在线压缩(和熊猫哥哥说再见了):再不用把JPG/JPEG图片拖 ...

  5. windows64位安装mysql-5.7.12,图文

    linux下安装mysql教程一大片,我就不说了,再此说下windows 下如何安装这个5.7版本,并且有些坑已踩! 一:进入mysql下载地址:http://www.mysql.com/downlo ...

  6. 搭建iis本地测试服务器

    在“开始”选择 “控制面板”,默认是以“类别”显示,   改成“小图标”显示   选择“程序和功能”   进入界面后,点击“启动或关闭Windows功能”   然后勾选图中的两个选框,注意一定要显示为 ...

  7. jmeter使用笔记——脚本录制,JMeter使用plugins插件进行服务器性能监控

    脚本录制: 1.badboy录制 2.代理服务器录制 ①工作台添加HTTP代理服务器 ②设置目标控制器,分组,排除模式,包含模式(使用正则表达式筛选) ③设置浏览器,手动设置代理服务器,localho ...

  8. JavaScript 日期处理类库 moment

    可以自定义自己需要的时间格式,中文文档如下: http://momentjs.cn/ http://momentjs.cn/docs/

  9. bzoj 2238 Mst——树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2238 一条非树边可以对一条链的树边产生影响.注意是边,所以把边下放到点上,只要跳 top 时 ...

  10. HDU2222(AC自动机入门题)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...