题目链接

首先,按照题意,把前$60$个素数打出来$[2$ $-$ $281]$。

因为只有$60$个,再加上本宝宝极其懒得写线性筛于是每一个都$O(\sqrt{n})$暴力筛就好了。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. int n;
  6. int main()
  7. {
  8. // freopen("1.txt","w",stdout);
  9. printf("");//格式问题,以自己爱好稍作更改。
  10. for(int i=;i<=;i++)
  11. {
  12. for(int j=;j*j<=i;j++)
  13. if(i%j==) goto rp;
  14. printf(",%d",i),n++;
  15. rp:;
  16. }
  17. return ;
  18. }

如果我们用$prime[i]$表示第i个素数。
筛出来是这样的:

  1. int prime[]={
  2. ,,,,,,,,,
  3. ,,,,,,,
  4. ,,,,,,,
  5. ,,,,,,
  6. ,,,,,
  7. ,,,,,
  8. ,,,,,
  9. ,,,,,
  10. ,,,,,
  11. ,,,,,
  12. ,
  13. };

---

之后,我们看 清点存款 操作,

问$[1,product]$里,有多少个$num$满足:

$$num*x+product*y=1$$

这,与我们 素数的性质 好像啊。

这就是 $num*x≡1$ $ $ $ $ $(mod$ $ $ $product)$

也就是 $gcd(num$ $,$ $product)$ $=$ $1$

嗯,好,问题转化成了:

求 $[1,product]$ 里,有多少个 $num$ 与 $product$ 互质。

也就是 $\varphi(product)$ 等于多少。

之后,根据欧拉函数的通式。

$$\varphi(n)=n*\prod_{p_i|n}(1-\frac{1}{p_i})=n*\prod_{p_i|n}\frac{p_i-1}{p_i}$$

看数据范围,又让 $mod$ $ $ $p$

所以,

再线性推一下逆元,

求解即可。

---

$ps:$ 如果脸黑被卡常数了的话,可以把 $[1-281]$ 的逆元打表。

大概代码是这样的:

  1. pni[]=;
  2. for(int i=;i<=;i++)
  3. pni[i]=(long long)(mod-mod/i)*pni[mod%i]%mod;

---

下面,就是区间维护。

题目中说了,~~(在出题人眼里)~~他们的加法相当于我们的乘法。

我们要维护区间 $[a,b]$ 的 “和” 记为 $product$

更改的是某个点(银行)$b_{i}$ 的存款

显然的线段树保存每段区间出现的质因子。

看题面,由于最多出现$60$个质数,我们用一个 $long$ $ $ $long$ 的每一位表示一个质数,然后用或运算$xor$即可实现 “加和” 相乘操作。

然后就……

好好的写代码吧。

不过……

模数为啥不是 $19260817$ 或者是 $998244353$ 或 $64123$ 呢……

---

$ps:$ 一定要看看线段树每次的区间边上判定 $!$ $!$ $!$

本宝宝调了两天 $……$

委屈巴巴。。。

---

上代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. #define mod 19961993
  6.  
  7. const int prime[]={
  8. ,,,,,,,,,
  9. ,,,,,,,
  10. ,,,,,,,
  11. ,,,,,,
  12. ,,,,,
  13. ,,,,,
  14. ,,,,,
  15. ,,,,,
  16. ,,,,,
  17. ,,,,,
  18. ,
  19. };//记录质数。
  20.  
  21. int pni[];
  22.  
  23. //线段树。
  24. struct data{
  25. long long sum;//区间(和)乘积
  26. long long p;//包含哪些素数。第i个二进制位如果是1,则有prime[i]这个素数,从1开始。
  27. }point[];
  28. data ans;//记录查询答案。
  29.  
  30. void built(int l,int r,int o)
  31. {
  32. if(l==r) {point[o].sum=;point[o].p=;return ;}
  33. int mid=(l+r)/;
  34. built(l,mid,o*);
  35. built(mid+,r,o*+);
  36.  
  37. // printf("%d %d %d %d\n",l,r,o,mid);
  38.  
  39. point[o].sum=point[o*].sum*point[o*+].sum%mod;
  40. point[o].p=;
  41. // printf("%d %d\n",point[o].sum,point[o].p);
  42. }
  43.  
  44. void chang(int l,int r,int o,const int t,const int k)//第t个点改为k
  45. {
  46. // printf("%d %d %d %d %d\n",&l,&r,&o,&t,&k);
  47. if(l==r){
  48. point[o].sum=k;
  49. long long p=;
  50. for(int i=;i<=;i++){
  51. if((k%prime[i])==) p|=1LL<<(i-);
  52. point[o].p=p;
  53. }
  54. return ;
  55. }
  56. int mid=(l+r)/;
  57. if(t<=mid) chang(l,mid,o*,t,k);
  58. else chang(mid+,r,o*+,t,k);
  59. point[o].sum=point[o*].sum*point[o*+].sum%mod;
  60. point[o].p=point[o*].p|point[o*+].p;
  61. }
  62.  
  63. void quest(int l,int r,int o,int l1,int r1)//查询L到R。
  64. {
  65. if(l1<=l&&r<=r1){
  66. ans.sum=ans.sum*point[o].sum%mod;
  67. ans.p|=point[o].p;
  68. return ;
  69. }
  70. int mid=(l+r)/;
  71. if(l1<=mid) quest(l,mid,o*,l1,r1);
  72. if(mid<r1) quest(mid+,r,o*+,l1,r1);
  73. }
  74. // void debug()
  75. // {
  76. // for(int i=1;i<=100;i++)
  77. // printf("%d %d %d\n",i,point[i].p,point[i].sum);
  78. // }
  79.  
  80. int main()
  81. {
  82.  
  83. // freopen("1.in","r",stdin);
  84. // freopen("1.out","w",stdout);
  85. built(,,);
  86.  
  87. pni[]=;
  88. for(int i=;i<=;i++)
  89. pni[i]=(long long)(mod-mod/i)*pni[mod%i]%mod;
  90. //线性筛逆元
  91.  
  92. int tt;
  93. scanf("%d",&tt);
  94. while(tt--)
  95. {
  96. int x;scanf("%d",&x);
  97.  
  98. if(x)
  99. {
  100. int t,k;
  101. scanf("%d%d",&t,&k);
  102. chang(,,,t,k);
  103. }
  104.  
  105. else
  106. {
  107. int l1,r1;
  108. ans.sum=;
  109. ans.p=;
  110. scanf("%d%d",&l1,&r1);
  111. quest(,,,l1,r1);
  112.  
  113. long long f=ans.sum;
  114. for(int i=;i<=;i++)//计算φ
  115. if(ans.p&(1LL<<(i-))) f=f*(prime[i]-)%mod,f=f*pni[prime[i]]%mod;
  116. printf("%d\n",(int)f);
  117.  
  118. }
  119. // debug();
  120. }
  121. return ;//程序拜拜
  122. }

题解 P4140 【奇数国 】的更多相关文章

  1. Bzoj 3813 奇数国 题解 数论+线段树+状压

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 748  Solved: 425[Submit][Status][Discuss] ...

  2. [BZOJ 3813]奇数国

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 736  Solved: 416[Submit][Status][Discuss] ...

  3. 【BZOJ3813】奇数国 线段树+欧拉函数

    [BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...

  4. [BZOJ3813] 奇数国 - 线段树

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 912  Solved: 508[Submit][Status][Discuss] ...

  5. AC日记——【清华集训2014】奇数国 uoj 38

    #38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...

  6. 【bzoj3813】: 奇数国 数论-线段树-欧拉函数

    [bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...

  7. 【题解】L 国的战斗续之多路出击 [P2129]

    [题解]L 国的战斗续之多路出击 [P2129] 传送门: \(L\) 国的战斗续之多路出击 \([P2129]\) [题目描述] 给出 \(n\) 个坐标,\(m\) 个指令,指令处理顺序应是从后往 ...

  8. HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)

    HYSBZ - 3813奇数国 中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的.所 ...

  9. 【数论&线段树】【P4140】[清华集训2015]奇数国

    Description 有一个长为 \(n\) 的序列,保证序列元素不超过 \(10^6\) 且其质因数集是前60个质数集合的子集.初始时全部都是 \(3\),有 \(m\) 次操作,要么要求支持单点 ...

随机推荐

  1. python爬西刺代理

    爬IP代码 import requests import re import dauk from bs4 import BeautifulSoup import time def daili(): p ...

  2. php学习之if

    <html> <head> <title>xxx</title> <style> #tian{ color:blue; float:left ...

  3. 泛型集合List<T>

  4. 配置环境是程序员的第一步 -- Xshell 6 免费版下载安装

    Xshell 是一个强大的安全终端模拟软件,通常用来连接云主机,远程控制云主机. 很多人都不知道 Xshell 有专门为家庭和学校用户提供的免费版,只需要填个用户名和邮箱即可. 免费版链接:https ...

  5. ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\WWFDATA.dbf'

    错误提示如下图: ORA-00372此时无法修改文件5 ORA-01110数据文件5'M:\DB_DATA\SEINESCMDB\WWFDATA_DATA01.dbf' 分析原因及解决方法: 1.查看 ...

  6. libevent 源码深度剖析十三

    libevent 源码深度剖析十三 —— libevent 信号处理注意点 前面讲到了 libevent 实现多线程的方法,然而在多线程的环境中注册信号事件,还是有一些情况需要小心处理,那就是不能在多 ...

  7. SpringBoot26 利用 Ribbon + RestTemplate 调用远程服务资源

    1 RestTemplate扫盲 借助 RestTemplate,Spring应用能够方便地使用REST资源  2 准备 创建三个springCloud项目 >Eureaka : 服务注册中心 ...

  8. SSL认证

    SSL认证 单向认证 1.发一串消息个对方 2.对方用私钥加密后返回 3.本方用对方的公钥解密,验证消息是否正确, 如果消息相同,则本方认可对方 双向认证 本方认证对方 对方认证本方

  9. adb shell unauthorized问题

    出现unauthorized 一般插上usb后,手机会弹出一个要求你授权debugging的对话框,如果没有的话,就是rsa_key有问题: /adb_keys. User-installed key ...

  10. Apache htdigest命令

    一.简介 htdigest命令是Apache的Web服务器内置工具,用于创建和更新储存用户名.域和用于摘要认证的密码文件.服务器上的资源可以被限制为仅允许由htdigest建立的文件中的用户访问.使用 ...