A - A HDU - 6287(质因数分解/普通因数分解)
时间:2020-04-20
本文章向大家介绍A - A HDU - 6287(质因数分解/普通因数分解),主要包括A - A HDU - 6287(质因数分解/普通因数分解)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
A - A HDU - 6287
思路
题意
- 给我一个长度为n长度乘法表达式\(a1*a2*a3*...*an\),又给我了\(a1 a2 ..an\) 相对应的值,给我们m次询问,每次询问给我们三个数 l、r、d, 表示意思是 \(al*al+1*...*ar\) 这段区间内的乘积(设其为x)能否是被 d整除?,再注意一下数据范围\(1=<ai<=1e5,n<=1e5,给的程序运行时间是4s\)
思路
- 首先直接求乘积会爆long long 肯定不行
- 给我们运行时间是4s,那么我们肯定是要经历一番计算的,我们考虑:如果一个数a能被另一个数b整除,那么a被分解成因子,b也被分解成因子,那么b因子一定是a因子集合的子集,接下来先补充一下质因子分解:任何一个数一个数都可以被分解成 一些质数的乘积
- 那么对于这一题,我们就可以把这个n个元素每一个都进行质因子分解,对于每一次询问我们都询问,我们都将d进行拆分,统计拆出来的质因子的数量进行统计,在与相应的\([l,r]\)区间内拆分拥有的值因子数量进行比较,如果d中的某个质因子的数量小与\([l,r]\)区间中的或者根本不存在的话,就输出No,,
-
剩下关键就是统计每\([l,r]\)区间的值因子的数量:这个主要是通过声vector
res[mxn] 这个容器,把某个数分解出来的质因子c作为下标,而res[c] 的值就是这个数的位置,这样相同的因子就在相同的容器中,这通过二分查找某个质因数的所在的位置 -
对应区间的查找(这个实现主要是通 lower_boud 找下限、uppper_bound找上限),方法都很巧妙,
-
其实这一题也可以不用质因子分解
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<stack>
void fre() { freopen("A.txt","r",stdin); freopen("Ans.txt","w",stdout); }
using namespace std;
const int mxn = 1e5 + 5;
vector<int> prime;
vector<int> res[mxn];
void Shai()
{
int ar[mxn];
for(int i = 2; i < mxn; i ++)
ar[i] = 1;
for(int i = 2; i < mxn; i ++)
{
if(i > mxn/i) break;
if(ar[i])
{
for(int j = i * i; j < mxn; j += i)
ar[j] = 0;
}
}
for(int i = 2; i < mxn; i ++)
if(ar[i])
prime.push_back(i);
}
bool query(int l, int r, int val, int cnt)
{
int tem = upper_bound(res[val].begin(), res[val].end(), r) - lower_bound(res[val].begin(), res[val].end(), l);
return tem >= cnt;
}
bool Solve(int l, int r, int d)
{
//质因数分解d
int cnt; //相同质因子数量
for(auto x : prime)
{
if(x*x > d) break;
cnt = 0;
while(d%x == 0 )
{
d /= x;
cnt ++;
}
if(cnt >= 1 && ! query(l, r, x, cnt))
return false;
}
if(d > 1 && ! query(l, r, d, 1))
return false;
return true;
}
void init()
{
for(int i = 1; i < mxn; i ++)
res[i].clear();
}
int main()
{
/* fre(); */
int t;
scanf("%d", &t);
Shai();
while(t --)
{
init();
int n, m;
scanf("%d %d", &n, &m);
int val;
//对每一数进行质因数拆分
for(int i = 1; i <= n; i ++)
{
scanf("%d", &val);
for(auto x : prime)
{
if(x*x > val) break;
while(val%x == 0)
{
val /= x;
res[x].push_back(i);
}
}
if(val > 1)
res[val].push_back(i);
}
int l, r, d;
while(m --)
{
scanf("%d %d %d", &l, &r, &d);
printf("%s\n", Solve(l, r, d) == true ? "Yes" : "No");
}
}
return 0;
}
原文地址:https://www.cnblogs.com/lql-nyist/p/12735978.html
- 中关村成为北京“高精尖”产业发展主阵地
- jquery-barcode:js实现的条码打印
- 页面json 格式化+颜色高亮
- Python 里 and、or 的计算规则
- Python中赋值、浅拷贝与深拷贝
- git 简易使用说明
- 开发篇-MySQL分区(一)
- Establishing SSL connection without server's identity verification is not recommended. According to
- Django-认证系统
- javascript:双链表-插入排序
- javascript:二叉搜索树 实现
- 自然语言处理 语言模型介绍
- 口水先擦干!从大数据看外卖如何拯救“忙”与“宅”
- javascript:巧用eval函数组装表单输入项为json对象
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 128. 最长连续序列
- 【DB笔试面试859】在Oracle中,内核参数kernel.shmall、kernel.shmall等分别代表什么含义?
- Nginx配置SSL证书
- java_Object类、日期时间类、System类、包装类
- [周末往期回顾]UNDO_TABLESPACE参数
- WordPress固定链接后404解决方法
- [Oracle故障处理]记一次INST_DRTLD_MISMATCH导致的version count过多的问题
- 查表法实现十进制转化成其他进制
- ArrayList源码分析
- java_String类、StringBuilder类、Arrays类、Math类的使用
- 抽象类与接口
- java_static、final、super、this关键字的使用
- Lambda表达式
- java_字节流、字符流
- HashMap源码分析