题目大意

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

number∗x+product∗y=1number*x+product*y=1number∗x+product∗y=1
其中x,y为任意整数,答案对19961993取模。


知识储备

  1. 裴蜀定理

a∗x+b∗y=ma*x+b*y=ma∗x+b∗y=m
有整数解当且仅当m为gcd(a,b)的倍数。

推论:
只有当a,b互质(即gcd(a,b)=1)时,等式a∗x+b∗y=1a*x+b*y=1a∗x+b∗y=1有整数解

  1. 欧拉函数

φ(n)=n∗(1−1p1)∗(1−1p2)∗...∗(1−1pi)(其中p为n的质因子)φ(n)=n*(1-\frac {1} {p1})*(1-\frac {1} {p2})*...*(1-\frac {1} {pi})\ \ (其中p为n的质因子)φ(n)=n∗(1−p11​)∗(1−p21​)∗...∗(1−pi1​)  (其中p为n的质因子)

表示1~n之间与n互质的数的个数。


思路

一如既往的一脸懵逼,直到听了大佬的讲解才豁然开朗。

首先,题目前三段那么多话,就是为了告诉你要求出给定区间内的所有数的乘积,并贴心的给出分解质因数的提示(财产只可能由前60个质数组成,不会出现大得吓人的质数)

于是大佬说:开60个树状数组,分别维护一段区间内的财产中不同的质因子共有多少个,(如树状数组1维护第一个质数2的个数,树状数组2维护第二个质数3的个数,以此类推…)对财产求和时再判断该区间内是否含有该质因子,如果有,就乘上相应的次数,这样就把乘积求出来了。

修改时,则要先对原先的钱分解质因数,并减去它的贡献,才能再加上修改后的值的贡献。

接下来考虑第二步,number∗x+product∗y=1number*x+product*y=1number∗x+product∗y=1代表什么意思?(大佬说:“真笨,连裴蜀定理也不知道”)

咳咳咳…

有了上面的知识储备,我们知道,只有当number与product互质时,等式才能成立,而number取值范围为1~product,问题就转化为求1~product中与product互质的数的个数,即product的欧拉函数。

有了上面的公式,我们只需要在对财产求和时,判断是否含有该质因子,如果有,则乘上pi−1pi-1pi−1再除以pipipi,(合起来即1−1pi1-\frac{1}{pi}1−pi1​)最后乘上求出的product,即product的欧拉函数值。

(好吧,大佬又教了我一种更秀的方法,果然数学好就是厉害,差点就去整逆元了)


代码

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const int N=100000,mod=19961993;
ll n,op,x,y,cnt,pro;
int money[N+1],tr[100][N+1],prime[100];
void update(int i,int x,int val)//修改树状数组里面某个银行里质因数的个数
{for(;x<=N;x+=x&-x)tr[i][x]+=val;
}
int query(int i,int x)//查询树状数组里面一段区间内质因数的个数
{int sum=0;for(;x;x-=x&-x) sum+=tr[i][x];return sum;
}
void divide(int k,int x,int f)
{int sum;for(int i=1;i<=60;i++){sum=0;while(k%prime[i]==0) k/=prime[i],sum++;if(sum) update(i,x,f*sum);//分解质因数后修改对应树状数组里面的值 }
}
bool judge(int x)
{for(int i=2;i*i<=x;i++)if(x%i==0) return false;return true;
}
ll ksm(ll k,ll p)
{ll pro=1;while(p){if(p&1ll) pro=(pro*k)%mod;p>>=1;k=k*k%mod;}return pro%mod;
}
int main()
{for(int i=2;i<=281;i++)if(judge(i)) prime[++cnt]=i;scanf("%lld",&n);for(int i=1;i<=N;i++) money[i]=3,update(2,i,1);//银行里的钱全初始化为3 for(int i=1;i<=n;i++){scanf("%lld%lld%lld",&op,&x,&y);if(op){divide(money[x],x,-1);//将原先money[x]的贡献减去 money[x]=y;divide(money[x],x,1);//加上现在money[x]的贡献 }else{pro=1;for(int i=1;i<=60;i++){int k=query(i,y)-query(i,x-1);//k为区间x~y中质因子prime[i]的个数 if(k){pro=pro*ksm(prime[i],k-1)%mod;//将k个质因数累乘起来 pro=pro*(prime[i]-1)%mod;//求phi ,因为要除以一个prime[i],所以上面少乘一个prime[i](否则要用逆元) }//phi(x)=x*(1-1/p1)*(1-1/p2)*...*(1-1/pn)}printf("%lld\n",pro%mod);}}return 0;
}

洛谷4140 奇数国相关推荐

  1. 洛谷 P1913 L国的战斗之伞兵

    L国的战斗之伞兵 题目背景 L国即将与I国发动战争!! 题目描述 为了在敌国渗透作战,指挥官决定:派出伞兵前往敌国!然而敌国的风十分强烈,能让伞兵在同一高度不停转悠,直到被刮到一个无风区--(可怜的小 ...

  2. 洛谷——P1910 L国的战斗之间谍

    https://www.luogu.org/problem/show?pid=1910#sub 题目背景 L国即将与I国发动战争!! 题目描述 俗话说的好:"知己知彼,百战不殆". ...

  3. 洛谷 P1911 L国的战斗之排兵布阵

    P1911 L国的战斗之排兵布阵 题目背景 L国即将与I国发动战争!! 题目描述 L国的指挥官想让他的每一个军营都呈现出国徽形--"L"形(方向无所谓).当然,他的指挥营除外(这叫 ...

  4. 洛谷 B2059 奇数求和

    奇数求和 题目描述 计算非负整数 mmm 到 nnn(包括 mmm 和 nnn)之间的所有奇数的和,其中,mmm 不大于 nnn,且 nnn 不大于 300300300.例如 m=3,n=12,m=3 ...

  5. 洛谷P2995奇数偶数

    题目描述 Bessie's cruel second grade teacher has assigned a list of N (1 <= N <= 100) positive int ...

  6. 洛谷 1226 取余运算||快速幂

    洛谷  取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...

  7. 【c++算法刷题笔记】——洛谷2

    1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...

  8. 【c++算法刷题笔记】——洛谷1

    2020/2/14-2/16 1. 循环提取一个数的每一位数字 while (d > 0) //d=0跳出循环 {x=d%10; //x每次为d的个位数 d = d / 10; //相当于d每次 ...

  9. 信息学奥赛一本通 1967:【14NOIP普及组】螺旋矩阵 | 洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵

    [题目链接] ybt 1967:[14NOIP普及组]螺旋矩阵 洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵 类似考题: 洛谷 P1014 [NOIP1999 普及组] Cantor 表 ...

最新文章

  1. OpenCV(六)形态学操作1--基础:膨胀与腐蚀(回调函数)
  2. IN-12辉光数码管:俄罗斯进口的器件
  3. 单台主机 kafka + zookeeper 集群搭建
  4. cs6 数据库mysql_能mysql内容
  5. w7设置双显示器_win7怎么用双显示器,如何设置???
  6. 无用的设计模式之装饰者模式
  7. 【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
  8. android10全局黑暗,传Android 11或加入自动切换全局黑暗模式功能
  9. 1.JUC锁的一些概念
  10. 解决easyExcel和poi版本冲突问题
  11. RDP(远程桌面很慢) slow performance, Hyper-V,IPv4 Checksum offload
  12. odoo开发笔记 -- 附件上传
  13. 天正建筑2016破解版 64位/32位最新版
  14. 设计师工作经验_得到我作为设计师的第一份工作
  15. 遥感影像地图编制流程
  16. 全国计算机等级考试-三级信息安全考试知识点(无顺序)
  17. RFID出入库管理是如何实施的
  18. 当代著名国际摄影师相关网站大集合
  19. openface源码理解(4)
  20. 【码云学习02】Git基本命令

热门文章

  1. 深圳注册公司可以异地办公吗
  2. 2022年十大数据泄露事件
  3. CSS 使文字纵向排列的七种方
  4. git commit -m XX报错 pre -commit hook failed (add --no-verify to bypass)问题
  5. 设计模式之—建造者模式(Builder)-Java实现
  6. vue手脚架配置请求头
  7. Python计算生态
  8. js对象是什么?如何理解js对象
  9. Matlab中使用LaTex字体
  10. 深度学习框架之PyTorch