题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6287

题意:给你n个数,每个数都很大;

有q次询问,让你判断一下从下标为: [L,R]的范围内 能否通过相乘得到给定数字K的倍数。

心路历程:

这个题,一看就和唯一分解定理有关,必须把每一个数的因子拆出来处理,但是怎么才能快速询问呢,

要做到这一步一定要二分处理,因为题目给定的n,m的范围    1e5  mlogm的复杂度。

后来比赛后:杨哥哥说了一句把它存起来,我就很懵比了,怎么样才可以把它的因子存起来???

其实它利用的是在对        K    这个数字分解成    多个质因子相乘的形式。

比如说n个数为:10,14,15,16,18,20;

对n个数进行预处理如下:

num[2]:        1    2    4    4    4    4    5    6    6

num[3]:        3    5    5

num[5]:    1    3    6

num[7]:        2

比如给你一个    K为48    L=2    ,R=4;

48=2*2*2*2*3            4个2       1个3    相乘得到

那它必须要在num[2]那里必须有4个下标为2-4的    2,

而num[3]也必须要有一个下标为2-4的 3,

询问的范围[L,R]的质因子的个数为:

upper_bound(num[X].begin(),num[X].end(),R)-lower_bound(num[X].begin(),num[X].end(),L)

算出这时候下标一个范围的个数;

只要有一个K所分解出来的质因子        个数>给定范围里的质因子    即可判断为NO;

这个题目有一点坑在于不能对素数进行打表处理。

贴上代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int prime[maxn],cnt,x[maxn];
/*void is_prime(){int t=0;for(int i=2;i<=maxn;i++){if(x[i]==0){x[i]=1;prime[t++]=i;for(int j=i;j<=maxn;j+=i){x[j]=2;}}}cnt=t;
}*/
vector<int>num[maxn];
int main()
{//is_prime();int T;scanf("%d",&T);while(T--){int n,m,L,R,D;int a[maxn];for(int i=0;i<maxn;i++){num[i].clear();}scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);for(int j=2;j*j<=a[i];j++){while(a[i]%j==0){num[j].push_back(i);a[i]/=j;}}if(a[i]>1){num[a[i]].push_back(i);}}while(m--){scanf("%d%d%d",&L,&R,&D);int ta=0,tb=0,flag=1;for(int i=2;i*i<=D;i++){tb=0;if(D%i==0){while(D%i==0){D/=i;tb++;}int tmp;
tmp=upper_bound(num[i].begin(),num[i].end(),R)-lower_bound(num[i].begin(),num[i].end(),L);if(tmp<tb){flag=0;break;}}}if(D>1){ta=D;tb=1;int tmp;
tmp=upper_bound(num[D].begin(),num[D].end(),R)-lower_bound(num[D].begin(),num[D].end(),L);if(tmp<1){flag=0;}}if(flag){printf("Yes\n");}else{printf("No\n");}}}return 0;
}

口算训练-(2018-女生赛)(二分+唯一分解定理)相关推荐

  1. HDU - 6287 口算训练 (质因子分解 + 二分)

    题意:给一个序列,问 [l, r] 连续区间的乘积能否被 d 整除 思路:用 vector 记录每个质因子在序列中出现的位置,upper_bound(vec[p].begin(), vec[p].en ...

  2. HDU6287 口算训练(唯一分解定理+二分)

    口算训练 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Sub ...

  3. hdu 6287 口算训练(二分+质因数分解+思维)

    口算训练 Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others) Total Sub ...

  4. python口算训练出题

    python口算训练出题 为了给妹妹出算数题,编了一个乘除法的出题代码,省去了许多时间 图片 obj=open(r"C:\Users\12483\Desktop\math.txt" ...

  5. 口算训练java_提高孩子口算能力的5大方法,超实用!(附练习,可打印)

    原标题:提高孩子口算能力的5大方法,超实用!(附练习,可打印) 来源: 网络 编辑:成长园(id:czy6688990) 小编提醒 关注成长园,后台回复"1201" 即可获取打印版 ...

  6. pyhton的tkinter制作简易口算训练器

    前言 最近参加实习投递,发现好多家企业不管是什么岗位(研发or职能)都会考验到大家的数学能力 例如宝洁笔试直接就上了口算题,限时是真的紧张. 楼主不仅编程能力垃圾,数学能力也从小没有得到很好的锻炼(键 ...

  7. CCPC2018女生赛口算训练6287

    #include <cstdio> #include <vector> #include <algorithm> #include <iostream> ...

  8. 2021年中国大学生程序设计竞赛 女生专场 - 热身赛 Problem C. 口算训练(质因子分解)

    题目分析:判断 xxx 是 yyy 的倍数,等价于质因子分解后, yyy 中的每个质因子的出现次数都小于等于其在 xxx 中的出现次数. 那么对于每次询问 [l,r,d][l,r,d][l,r,d], ...

  9. 用java编程100道问题//10弟弟的作业,口算训练

    弟弟的作业 题目描述 Rock的弟弟刚做完了"100以内数的加减法"这部分的作业,请你帮他检查一下.每道题目(包括弟弟的答案)的格式为a + b = c或者a – b = c,其中 ...

最新文章

  1. C语言必须会写的10道经典题(小白必看!)
  2. 怎么批量选择目标_全日制专升本一次可以报几个学校?目标院校应该怎么选择?...
  3. 基于C#开发的浏览器隐身工具-上班别乱开
  4. Armadillo的安装
  5. 总结新浪friendship接口
  6. opencv c++讲解jzg mxy tyd_python看代码就行
  7. docker 之镜像制作dockerfile
  8. c语言atm机实训目的意义,计算机实习目的与意义
  9. OpenCV特征检测与匹配方法概览
  10. c语言alt 小键盘,ALT+小键盘输入《泡MM好招》
  11. 测试大会能给我们带来什么?
  12. 迷宫生成算法和迷宫寻路算法
  13. 6.4 二项式系数和恒等式
  14. 网站频繁抓取IP被封
  15. 三栏布局:左右固定,中间自适应的几种方式
  16. Geany 编程工具的使用
  17. 代码行统计工具:根据命令行输入的指定目录及文件类型进行统计目录或单个文件的代码行数
  18. PHP单例模式的本质
  19. 纯HTML+JS实现跑酷游戏
  20. Verilog HDL 基础

热门文章

  1. Java 序列化及解决方案
  2. 鸢尾花数据集聚类分析
  3. 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成
  4. [[面经]]广移,纯干货
  5. 微软:大数据将为香港带来机遇
  6. std:move基本用法
  7. scp 报错:reverse mapping checking getaddrinfo for......failed - POSSIBLE BREAK-IN ATTEMPT!
  8. 在线c语言考试模拟试题,C语言模拟考试试题选择题(模拟).doc
  9. mysql+连接每一行数据_MySQL_深入mysql基础知识的详解,1.每个客户端连接都会从服务 - phpStudy...
  10. 实习笔记:实作第一天工作总结