题目链接: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 4

Sample 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-这个是道数学题(线段树+整数分解的应用)相关推荐

  1. c++自带的可持久化平衡树?rope大法好!(超详细解答 + 5道例题讲解,可直接替代可持久化的线段树、并查集、平衡树!)

    整理的算法模板合集: ACM模板 目录 c++自带的可持久化平衡树?rope大法好! 1. 声明 2. 支持操作 char类型的rope int类型的rope 3. 具体的细节 4. "可持 ...

  2. Wannafly挑战赛22 D 整数序列 (线段树维护三角函数值)

    链接:https://ac.nowcoder.com/acm/contest/160/D 来源:牛客网 整数序列 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  3. 2019计蒜之道复赛-A-外教 Michale 变身大熊猫(线段树求LIS及其元素出现概率)

    时限:1000ms            空间限制:524288K 题目链接https://nanti.jisuanke.com/t/39611 外教变身萌翻小学员,VIPKID "AR 变 ...

  4. [bzoj4942][noi2017]整数【线段树】

    [题目描述] http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf [题解] 每个操作若不要进退位就暴力修改,否则用线段树找到下一个可以进退位的地 ...

  5. 计蒜之道2019 复赛 A.外教 Michale 变身大熊猫 线段树辅助建分层图dp

    题意:给出一个序列,随机取出其中一条最长上升子序列,问你取到每个数的概率是多少. 说起概率,我们可以尝试去求最长上升子序列的个数,显然每个点被取到的概率是 含有这个点的最长上升子序列个数/总共最长上升 ...

  6. CDOJ1324-卿学姐与公主 【线段树点更新】

    http://acm.uestc.edu.cn/#/problem/show/1324 卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory ...

  7. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树

    [Lydsy2017省队十连测]公路建设 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 93  Solved: 53 [Submit][Status ...

  8. 【学习笔记】线段树详解(全)

    [学习笔记]线段树详解(全) 和三个同学一起搞了接近两个月的线段树,头都要炸了T_T,趁心态尚未凉之前赶快把东西记下来... [目录] [基础]作者:\((Silent\)_\(EAG)\) [懒标记 ...

  9. bzoj 3838: [Pa2013]Raper (线段树)

    3838: [Pa2013]Raper Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 53  Solved: 27 [Submit][Status] ...

最新文章

  1. 安装nagios时出现version 1.21 does not match bootstrap parameter 1.35的解决办法
  2. ajax得到后端数据一直提示为[object Object]解决方法
  3. 消息中间件之JMS实践(ActiveMQ)
  4. 《代码大全》阅读笔记-18-表驱动法
  5. ir2104s的自举电容_电赛必备,IR2104S半桥驱动MOS管电机驱动板(PCB工程文件+磁悬浮代码)...
  6. java随机数生成(固定位数)
  7. 外设驱动库开发笔记3:AD527x系列数字电位器驱动
  8. Disruptor内存消息队列的资料整理
  9. C/S系统实现两数求和(非阻塞+epoll+心跳包检测用户在线状况+滚动日志+配置文件.)...
  10. 如何在iPhone / Android上进行Facebook联系人同步
  11. hbase 伪分布安装 java_HBase伪分布搭建
  12. 编写36选7的彩票程序
  13. 基于Neo4j图数据库的反欺诈模型初探1
  14. 概率论与随机过程难题整理复习
  15. 为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面?
  16. 主力用计算机吸筹,主力底部吸筹 副图
  17. 监控安装ESXi on Arm的树莓派4b的CPU温度
  18. 数据还原(recover)
  19. 基于硬件的消息队列中间件 Solace 简介之二
  20. MDM市场诸侯混战,烽火发布MobileArk战略布局

热门文章

  1. 【论文阅读记录】一篇关于地震预测的论文
  2. crazyflie学习(4):crazyflie飞行与日志
  3. navicat 使用ssl连接 docker + mysq
  4. oracle oaf结构,配置Oracle ebs的oaf开发环境步骤详解
  5. 最直白详细:“1字节(byte)”等于多少“位(bit)”
  6. java输出m行n列方格_java从键盘输入两个整数m、n,生成一个m行n列的二维数组,对数组进行任...
  7. 使用FlipClock.js 制作精美的定时器
  8. Java中的java、javax、sun、org包有什么区别
  9. atlas大图拆分,Atlas图集拆分工具
  10. ignore_checksum_failure