qduoj-这个是道数学题(线段树+整数分解的应用)
题目链接:https://qduoj.com/problem/825
Description
Onion的数论很差,所以作为数学大佬的lb给onion出了一道私家特训提高题
首先给出n,m,代表接下来会有n个数字和m个操作
操作op有两个类型:
当op==1的时候,会输入一个新的下标pos和数值values, 使得 A[pos]=values
当op==2的时候,会输入一个左端点left和一个右端点right,令 MUL=A[left]*A[left+1]*.....*A[right], 求解MUL的因子数目
对于每个操作2,你需要给出答案,由于答案可能会比较大,所以你输出的答案要对998244353进行取余。
Input
1<=n<=1e5
1<=m<=1e5
1<=Ai<=10
1<= p <=n
1<=v <=10
1<=l<=r<=n
Output
对于每一个操作2输出答案
注:每个答案占一行
Sample Input 1
4 2 2 2 2 7 2 1 1 1 4 4Sample Output 1
2
思路:很显然是一个线段树的题目,关键是如何处理求解区间积的因子数。
整数分解 又称素因数分解,是将一个正整数写成几个约数的乘积。
例如:对于一个整数a,可以分解为若干个素数b,c,d的乘积,即 a=(b^e)*(c^f)*(d^g)。
那么a的因子数为(e+1)*(f+1)*(g+1)。
因为1<=Ai<=10,所以用2,3,5,7这四个素数就能表示所有的Ai(1不用考虑)。
这样就转化为求解区间内2,3,5,7的个数。具体见代码。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <queue> #include <vector> #include <string> #define cla(a, sum) memset(a, sum, sizeof(a)) #define rap(i, m, n) for(int i=m; i<=n; i++) #define rep(i, m, n) for(int i=m; i>=n; i--) #define bug printf("???\n") using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll, ll> P; const int Inf = 0x3f3f3f3f; const double eps = 1e-8; const int maxn = 1e5+5; const int mod = 998244353; template <typename T> void read(T &x){x = 0; int f = 1; char ch = getchar();while (!isdigit(ch)) {if (ch == '-') f = -1; ch = getchar();}while (isdigit(ch)) {x = x * 10 + ch - '0'; ch = getchar();}x *= f; }int n,m; struct node{int l,r;ll cnt[10]; }f[4*maxn]; int a[maxn];void update(int ans,int c){while(c%2==0) f[ans].cnt[2]++,c/=2;while(c%3==0) f[ans].cnt[3]++,c/=3;while(c%5==0) f[ans].cnt[5]++,c/=5;while(c%7==0) f[ans].cnt[7]++,c/=7; } void push_up(int ans){f[ans].cnt[2]=f[ans<<1].cnt[2]+f[ans<<1|1].cnt[2];f[ans].cnt[3]=f[ans<<1].cnt[3]+f[ans<<1|1].cnt[3];f[ans].cnt[5]=f[ans<<1].cnt[5]+f[ans<<1|1].cnt[5];f[ans].cnt[7]=f[ans<<1].cnt[7]+f[ans<<1|1].cnt[7]; } void build(int ans,int l,int r){f[ans].l =l;f[ans].r =r;cla(f[ans].cnt ,0);//初始化 if(l==r){update(ans,a[l]);return ;}int mid=(l+r)>>1;build(ans<<1,l,mid);build(ans<<1|1,mid+1,r);push_up(ans); } void change(int ans,int id,int val){if(f[ans].l ==f[ans].r ){cla(f[ans].cnt ,0);//修改的时候,注意将数组清零 update(ans,val);return ;}int mid=(f[ans].l +f[ans].r )>>1;if(id<=mid)change(ans<<1,id,val);else if(id>mid)change(ans<<1|1,id,val);push_up(ans); }node query(int ans,int l,int r){if(f[ans].l >=l&&f[ans].r <=r){return f[ans];}int mid=(f[ans].l +f[ans].r )>>1;if(r<=mid)return query(ans<<1,l,r);else if(l>mid)return query(ans<<1|1,l,r);else{node u=query(ans<<1,l,mid);node w,v=query(ans<<1|1,mid+1,r);w.cnt[2]=u.cnt[2]+v.cnt[2];w.cnt[3]=u.cnt[3]+v.cnt[3];w.cnt[5]=u.cnt[5]+v.cnt[5];w.cnt[7]=u.cnt[7]+v.cnt[7];return w; } }int main() {read(n);read(m);rap(i,1,n)read(a[i]);build(1,1,n);int op;while(m--){int u,v;read(op);read(u);read(v);if(op==1){change(1,u,v);}else if(op==2){node w=query(1,u,v);ll sum=(w.cnt[2]+1)%mod*(w.cnt[3]+1)%mod*(w.cnt[5]+1)%mod*(w.cnt[7]+1)%mod;printf("%lld\n",sum);}}return 0; }
qduoj-这个是道数学题(线段树+整数分解的应用)相关推荐
- c++自带的可持久化平衡树?rope大法好!(超详细解答 + 5道例题讲解,可直接替代可持久化的线段树、并查集、平衡树!)
整理的算法模板合集: ACM模板 目录 c++自带的可持久化平衡树?rope大法好! 1. 声明 2. 支持操作 char类型的rope int类型的rope 3. 具体的细节 4. "可持 ...
- Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)
链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...
- 2019计蒜之道复赛-A-外教 Michale 变身大熊猫(线段树求LIS及其元素出现概率)
时限:1000ms 空间限制:524288K 题目链接https://nanti.jisuanke.com/t/39611 外教变身萌翻小学员,VIPKID "AR 变 ...
- [bzoj4942][noi2017]整数【线段树】
[题目描述] http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf [题解] 每个操作若不要进退位就暴力修改,否则用线段树找到下一个可以进退位的地 ...
- 计蒜之道2019 复赛 A.外教 Michale 变身大熊猫 线段树辅助建分层图dp
题意:给出一个序列,随机取出其中一条最长上升子序列,问你取到每个数的概率是多少. 说起概率,我们可以尝试去求最长上升子序列的个数,显然每个点被取到的概率是 含有这个点的最长上升子序列个数/总共最长上升 ...
- CDOJ1324-卿学姐与公主 【线段树点更新】
http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others) Memory ...
- bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树
[Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 93 Solved: 53 [Submit][Status ...
- 【学习笔记】线段树详解(全)
[学习笔记]线段树详解(全) 和三个同学一起搞了接近两个月的线段树,头都要炸了T_T,趁心态尚未凉之前赶快把东西记下来... [目录] [基础]作者:\((Silent\)_\(EAG)\) [懒标记 ...
- bzoj 3838: [Pa2013]Raper (线段树)
3838: [Pa2013]Raper Time Limit: 60 Sec Memory Limit: 128 MB Submit: 53 Solved: 27 [Submit][Status] ...
最新文章
- 安装nagios时出现version 1.21 does not match bootstrap parameter 1.35的解决办法
- ajax得到后端数据一直提示为[object Object]解决方法
- 消息中间件之JMS实践(ActiveMQ)
- 《代码大全》阅读笔记-18-表驱动法
- ir2104s的自举电容_电赛必备,IR2104S半桥驱动MOS管电机驱动板(PCB工程文件+磁悬浮代码)...
- java随机数生成(固定位数)
- 外设驱动库开发笔记3:AD527x系列数字电位器驱动
- Disruptor内存消息队列的资料整理
- C/S系统实现两数求和(非阻塞+epoll+心跳包检测用户在线状况+滚动日志+配置文件.)...
- 如何在iPhone / Android上进行Facebook联系人同步
- hbase 伪分布安装 java_HBase伪分布搭建
- 编写36选7的彩票程序
- 基于Neo4j图数据库的反欺诈模型初探1
- 概率论与随机过程难题整理复习
- 为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面?
- 主力用计算机吸筹,主力底部吸筹 副图
- 监控安装ESXi on Arm的树莓派4b的CPU温度
- 数据还原(recover)
- 基于硬件的消息队列中间件 Solace 简介之二
- MDM市场诸侯混战,烽火发布MobileArk战略布局
热门文章
- 【论文阅读记录】一篇关于地震预测的论文
- crazyflie学习(4):crazyflie飞行与日志
- navicat 使用ssl连接 docker + mysq
- oracle oaf结构,配置Oracle ebs的oaf开发环境步骤详解
- 最直白详细:“1字节(byte)”等于多少“位(bit)”
- java输出m行n列方格_java从键盘输入两个整数m、n,生成一个m行n列的二维数组,对数组进行任...
- 使用FlipClock.js 制作精美的定时器
- Java中的java、javax、sun、org包有什么区别
- atlas大图拆分,Atlas图集拆分工具
- ignore_checksum_failure