奇数国

链接

Luogu_P4140 奇数国

题目描述

在一片美丽的大陆上有100000100000100000个国家,记为111到100000100000100000。这里经济发达,有数不尽的账房,并且每个国家有一个银行。

某大公司的领袖在这100000100000100000个银行开户时都存了333大洋,他惜财如命,因此会不时地派小弟 GFS 清点一些银行的存款或者让GFS改变某个银行的存款。

该村子在财产上的求和运算等同于我们的乘法运算,也就是说领袖开户时的存款总和为31000003^{100000}3100000。这里发行的软妹面额是最小的60个素数p1=2,p2=3,…,p60=281p_1=2,p_2=3,\ldots, p_{60}=281p1​=2,p2​=3,…,p60​=281,任何人的财产都只能由这 6060 个基本面额表示,即设某个人的财产为fortunefortunefortune(正整数),则 fortune=p1k1×p2k2×…p60k60fortune=p_1^{k_1} \times p_2^{k_2} \times \ldots p_{60}^{k_{60}}fortune=p1k1​​×p2k2​​×…p60k60​​。

领袖习惯将一段编号连续的银行里的存款拿到一个账房去清点,为了避免 GFS 串通账房叛变,所以他不会每次都选择同一个账房。GFS 跟随领袖多年已经摸清了门路,知道领袖选择账房的方式。如果领袖选择清点编号在[a,b][a,b][a,b]内的银行财产,他会先对[a,b][a,b][a,b]的财产求和(记为productproductproduct),然后在编号属于[1,product][1,product][1,product]的账房中选择一个去清点存款,检验自己计算是否正确同时也检验账房与 GFS 是否有勾结。GFS 发现如果某个账房的编号 numbernumbernumber与productproductproduct相冲,领袖绝对不会选择这个账房。

怎样才算与productproductproduct不相冲呢?若存在整数 x,yx,yx,y 使得number×x+product×y=1number \times x+product \times y=1number×x+product×y=1,那么我们称numbernumbernumber与productproductproduct不相冲,即该账房有可能被领袖相中。当领袖又赚大钱了的时候,他会在某个银行改变存款,这样一来相同区间的银行在不同的时候算出来的productproductproduct可能是不一样的,而且领袖不会在某个银行的存款总数超过10610^6106 。

现在 GFS 预先知道了领袖的清点存款与变动存款的计划,想请你告诉他,每次清点存款时领袖有多少个账房可以供他选择,当然这个值可能非常大,GFS 只想知道对 199619931996199319961993 取模后的答案。

输入格式

第一行一个整数xxx表示领袖清点和变动存款的总次数。

接下来xxx行,每行333个整数ai,bi,cia_i,b_i,c_iai​,bi​,ci​ 。aia_iai​为000时表示该条记录是清点计划,领袖会清点bib_ibi​到cic_ici​的银行存款,你需要对该条记录计算出 GFS 想要的答案。aia_iai​
为111时表示该条记录是存款变动,你要把银行bib_ibi​的存款改为cic_ici​ ,不需要对该记录进行计算。

输出格式

对于每个询问,输出一行一个整数表示答案。

输入输出

输入 #1
6
0 1 3
1 1 5
0 1 3
1 1 7
0 1 3
0 2 3
输出 #1
18
24
36
6

数据范围

所有数据均满足:x≥1x≥1,ci−bi≥0x \geq 1x≥1,c_i -b_i \geq 0x≥1x≥1,ci​−bi​≥0。

思路

又是一道根本不知道怎么用树状数组解的题目。

不过呢,看到number×x+product×y=1number \times x+product \times y=1number×x+product×y=1这个式子,我们自然而然地可以想到“若a,ba,ba,b互质,则有ax+by=1ax+by=1ax+by=1”这个结论。所以我们可以看出,numbernumbernumber和productproductproduct一定是一对互质数。

题目中要求统计与productproductproduct“相冲”的numbernumbernumber的个数,而numbernumbernumber又⩽product\leqslant product⩽product,于是我们可以想到用专门求“小于或等于nnn的正整数中与nnn互质的数的数目”的欧拉函数“φ(n)\varphi (n)φ(n)”。

到这里,最基本的问题就解决了。

接下来的问题是,我们如何存储31000003^{100000}3100000这么大的数呢?

当然是质因数分解啦!

我们把每个银行的存的钱的数目进行质因数分解,再用树状数组统计每个数各有哪些质因子。这样做的好处是,既可以存储31000003^{100000}3100000这么大的数,又可以方便我们对欧拉函数中的∏i=1k(1−1pi)\prod_{i=1}^{k}(1-\frac{1}{p_i})∏i=1k​(1−pi​1​)进行运算。

当我们拿到一个[b,c][b,c][b,c]的区间时,我们可以先将[b,c][b,c][b,c]之间的数所拥有的质因子乘起来,算出productproductproduct,再算φ(product)\varphi (product)φ(product)。

于是,我们就有了计算φ(product)\varphi (product)φ(product)的式子:
φ(product)=∏i=1npiki×∏i=1n(1−1pi)\varphi (product)=\prod_{i=1}^{n}p_i^{k_i}\times\prod_{i=1}^{n}(1-\frac{1}{p_i})φ(product)=i=1∏n​piki​​×i=1∏n​(1−pi​1​)
其中,nnn为productproductproduct的质因子的个数,pip_ipi​为productproductproduct的每个质因子,kik_iki​为对应pip_ipi​的指数。

不过,因为这里涉及分数以及除法,不方便在计算机中计算,所以我们需要把这个式子变形一下。

首先,“×\times×”号右边的式子可以变形一下,变成:
φ(product)=∏i=1npiki×∏i=1npi−1pi\varphi (product)=\prod_{i=1}^{n}p_i^{k_i}\times\prod_{i=1}^{n}\frac{{p_i}-1}{p_i}φ(product)=i=1∏n​piki​​×i=1∏n​pi​pi​−1​

接着,由于每个pi{p_i}pi​既要乘ki{k_i}ki​次,又要除111次,所以我们又可以把式子变成:
φ(product)=∏i=1npiki−1×∏i=1npi−1\varphi (product)=\prod_{i=1}^{n}p_i^{k_i-1}\times\prod_{i=1}^{n}{{p_i}-1}φ(product)=i=1∏n​piki​−1​×i=1∏n​pi​−1

再变一下,就成了:
φ(product)=∏i=1n(piki−1×pi−1)\varphi (product)=\prod_{i=1}^{n}(p_i^{k_i-1}\times{{p_i}-1})φ(product)=i=1∏n​(piki​−1​×pi​−1)

这样就方便我们在计算机里计算了。

最后,不要忘记在计算的时候进行取模运算,不要忘记用long long类型,否则答案会爆。

感谢做题过程中大佬们的谆谆教诲。

代码

#include<cstdio>
using namespace std;
const long long N=100000,MOD=19961993;
long long n,a,b,c,tre[61][2*N+1],mon[N+1],pro;//树状数组存每个数分解质因数的结果
long long prime[60+1];
bool vis[281+1];
void Euler()
{long long cntA=0;for(int i=2;i<=281;i++){if(!vis[i]){cntA++;prime[cntA]=i;}for(int j=1;j<=cntA&&i*prime[j]<=281;j++){vis[i*prime[j]]=true;if(!i%prime[j])break;}}
}
long long lowbit(int i)
{return i&(-i);
}
void update(long long i,long long j,long long x)//i:质因子的编号;j:数的下标;x:质因子个数;
{while(j<=N){tre[i][j]+=x;j+=lowbit(j);}
}
long long index(long long i,long long j)//i:质因子的编号;j:数的下标;
{long long ans=0;while(j>0){ans+=tre[i][j];j-=lowbit(j);}return ans;
}
void decompose(long long n,long long j,long long p)//p:判断对树状数组中的某个值是+还是-;
{long long cntB;for(long long i=1;i<=60;i++){cntB=0;while(!(n%prime[i])){cntB++;n/=prime[i];}if(cntB)update(i,j,cntB*p);}
}
long long fast_power(long long n,long long m)//快速幂
{long long ans=1;while(m>0){if(m%2)ans=ans*n%MOD;n=n*n%MOD;m/=2;}return ans;
}
int main()
{Euler();scanf("%d",&n);for(long long i=1;i<=N;i++){mon[i]=3;update(2,i,1);//每个数最开始都是3,分解质因数后都等于3}for(long long i=1;i<=n;i++){scanf("%d%d%d",&a,&b,&c);if(a)//修改 {decompose(mon[b],b,-1);//分解质因数mon[b]=c;decompose(mon[b],b,1);}else//查询{pro=1;for(long long j=1;j<=60;j++){long long cntC=0;cntC=index(j,c)-index(j,b-1);//求product的质因子prime[i]的指数if(!cntC)continue;pro=pro*fast_power(prime[j],cntC-1)*(prime[j]-1)%MOD;//上文提到的欧拉函数的变形}printf("%d\n",pro%MOD);}}return 0;
}

Luogu_P4140 奇数国相关推荐

  1. BZOJ 3813 奇数国

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MB Description 在一片美丽的大陆上有100000个国家,记为1到100000.这里经济发达 ...

  2. uoj#38. 【清华集训2014】奇数国(线段树+数论)

    传送门 不难看出就是要先求区间积,再求这个区间积的\(\varphi\) 因为\(\varphi(x)=x\times\frac{p_1-1}{p_1}\times\frac{p_2-1}{p_2}\ ...

  3. 洛谷4140 奇数国

    题目大意 给定一个初值全为3.长度为100000的序列,并实时改变其中的值,求出给定区间内所有数的乘积product后,问有多少个小于等于product的正整数number满足这个式子: number ...

  4. [清华集训2014]奇数国

    题目:BZOJ3813.UOJ#38.洛谷P4140. 题目大意:某国家有100000个银行,初始每个银行只有3块钱.有两个操作:①修改某个银行存的钱:②求某段区间内所有钱的"总和" ...

  5. [颓废史]蒟蒻的刷题记录

    QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...

  6. Python 程序设计(第二版)董付国_清华大学出版社_习题答案与分析【针对8.4及其之前的】

    更多精彩内容:(没有设置公众号获得,麻烦动动小手~谢谢) CSDN下载:Python编程无师自通电子书,[美]科里·奥尔索夫(Cory Althoff)-文档类-CSDN下载 百度云:链接:https ...

  7. 国二c语言改错题答案,c语言国二考试编程题答案

    <c语言国二考试编程题答案>由会员分享,可在线阅读,更多相关<c语言国二考试编程题答案(65页珍藏版)>请在人人文库网上搜索. 1.1m个人的成绩存放在score数组中,请编写 ...

  8. vb计算机水平考试笔试,2007年4月全国计算机等级考试二级VB笔试试卷及参考答案...

    一. 选择题(第小题2分,共70分) 下列各题A).B).C).D)四个选项中,只有一个选项是正确的.请将正确选项填涂在答题卡相应位置上,答在试卷上不得分. (1) 下列叙述中正确的是 A) 算法的效 ...

  9. 电大计算机本科离散数学考试题,国开(中央电大)本科《离散数学(本)》网上形考(任务一至三)试题及答案...

    <国开(中央电大)本科<离散数学(本)>网上形考(任务一至三)试题及答案>由会员分享,可在线阅读,更多相关<国开(中央电大)本科<离散数学(本)>网上形考(任 ...

最新文章

  1. ONOS项目首赢11000次下载 Oracle发布云路由
  2. WIN7无法记住远程登录密码
  3. orcale的rank(排名函数)实例
  4. centos mysql rpm re_CentOS 7 RPM 安装 MySQL5.7
  5. Runtime.getRuntime().exec()----记录日志案例
  6. mysql 按字段排序
  7. ztree带有选项框的树形菜单使用
  8. Baidu All Reduce
  9. 续【将数据从MongoDB迁移到mysql】
  10. java代码抖音舞,java实现抖音代码舞源码
  11. 浅谈csdn写博客几年来的感受———已结题
  12. pygame教程:第一课 初始化和主循环
  13. 龙蜥社区第十次运营委员会议顺利召开!
  14. 007-绘制三角函数图像(一)
  15. 从爬虫构建数据集到CNN模型的验证码识别,一步一步搭建基于Python的PC个人端12306抢票程序
  16. 第一阶段:2014年10月13日-12月14日,36天完成。每周5天,8周完成。
  17. 猜想2010年IT十大表情
  18. python高级学习笔记Day04--01 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式
  19. 乌班图linux分辨率不能调,ubuntu分辨率1024*768无法选择解决方法
  20. 博客之星规则能否参照“金球奖”

热门文章

  1. 避免这些坑,让你快速找到好工作
  2. Java+JSP+MySQL基于SSM的医院挂号就诊系统
  3. 曹图强:思科正成为全数字化转型基石
  4. PaaS的五个核心价值
  5. 地理位置处理---Redis的GeoHash和MySQL的geography类型(之后有空再详细介绍)
  6. APP打开提示 应用未安装
  7. 爱心 (css动画)
  8. jack -学习颜色的调配
  9. 一亿行删除或修改一千万行的思路总结
  10. 摩托罗拉ME525搜索键改锁屏键