【线段树/数学/扩展欧几里得】 Bzoj 3913:奇数国
Description
Input
Output
看到这题,我们先不去管别的。。先把题意看懂!(说多了都是泪啊QAQ)
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> #define maxn 100001 #define mod 19961993 typedef long long ll; using namespace std; int prime[],ff[]; ll inv[],x,y; bool is_prime[]; struct tr{
int l,r;
ll ans,mark;
}tree[maxn*]; void exgcd(int n,int m)
{
if(m==){x=,y=;return;}
exgcd(m,n%m);
ll t=x;
x=y,y=t-n/m*y;
} void pre()
{
inv[]=;
int b=;
for(int i=;i<=;i++)
{
if(!is_prime[i])prime[++b]=i,exgcd(i,mod),inv[i]=(x%mod+mod)%mod,ff[i]=b;
int j=,t=*i;
while(j<=b&&t<=)
{
is_prime[t]=;
if(i%prime[j]==){break;}
t=prime[++j]*i;
}
}
return;
} int read()
{
int x=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x;
} void build(int l,int r,int num)
{
tree[num].mark=<<;
if(l==r){tree[num].l=tree[num].r=l;tree[num].ans=;return;}
int mid=(l+r)>>;build(l,mid,num<<);build(mid+,r,(num<<)+);
tree[num].l=l,tree[num].r=r,tree[num].ans=tree[num<<].ans*tree[(num<<)+].ans%mod;
} ll pow(int k)
{
ll x=,ans=;
while(k!=)
{
if(k&)ans=ans*x;
x=x*x;
k>>=;
}
return ans;
} void fen(int shu,int wei)
{
tree[wei].mark=;
for(int i=;i<=sqrt(shu);i++)if(shu%i==&&!is_prime[i]){
while(shu%i==)shu/=i;
tree[wei].mark+=pow(ff[i]);
}
if(shu!=)tree[wei].mark+=pow(ff[shu]);
} void update(int wei,int des,int change)
{
if(tree[wei].l==tree[wei].r){
tree[wei].ans=change;
fen(change,wei);
return;
}
int mid=(tree[wei].l+tree[wei].r)>>;
if(mid>=des)update(wei<<,des,change);
else update((wei<<)+,des,change);
tree[wei].ans=tree[(wei<<)].ans*tree[(wei<<)+].ans%mod;
tree[wei].mark=tree[(wei<<)].mark | tree[(wei<<)+].mark;
} ll ans; ll find(int l,int r,int num)
{
if(tree[num].l==l&&tree[num].r==r){ans=ans*tree[num].ans%mod;return tree[num].mark;}
int mid=(tree[num].l+tree[num].r)>>;
if(mid>=r)return find(l,r,num<<);
else if(mid<l)return find(l,r,(num<<)+);
else return find(l,mid,num<<) | find(mid+,r,(num<<)+);
} ll solve(int l,int r)
{
ll state=find(l,r,);
for(int i=;i<=;i++)
if(state>>i & )ans=(ans*(prime[i]-)%mod*inv[prime[i]]%mod);
return ans;
} int main()
{
int n;
pre();
scanf("%d",&n);
build(,,);
for(int i=;i<=n;i++)
{
bool doing=read();
int x=read(),y=read();
if(doing)update(,x,y);
else ans=,printf("%lld\n",solve(x,y));
}
return ;
}
一定要看清题意!
【线段树/数学/扩展欧几里得】 Bzoj 3913:奇数国的更多相关文章
- 【数学/扩展欧几里得/线性求逆元】[Sdoi2008]沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...
- 【数学/扩展欧几里得/Lucas定理】BZOJ 1951 :[Sdoi 2010]古代猪文
Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...
- 洛谷P3951 小凯的疑惑 - 数学 /扩展欧几里得
传送门 题意:求出a和b不能通过线性组合(即n*a+m*b)得到的最大值: 思路:摘自洛谷: 不妨设 a<b 假设答案为 x 若 x≡m*a ( mod b )(1≤m≤b−1) (mod3)什 ...
- 【数学】【NOIp2012】同余方程 题解 以及 关于扩展欧几里得与同余方程
什么是GCD? GCD是最大公约数的简称(当然理解为我们伟大的党也未尝不可).在开头,我们先下几个定义: ①a|b表示a能整除b(a是b的约数) ②a mod b表示a-[a/b]b([a/b]在Pa ...
- interesting Integers(数学暴力||数论扩展欧几里得)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwwAAAHwCAIAAACE0n9nAAAgAElEQVR4nOydfUBT1f/Hbw9202m0r8
- UVa 11768 格点判定(扩展欧几里得求线段整点)
https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后 ...
- C. Ray Tracing——披着搜索外衣的扩展欧几里得
[题目大意] 给你一个n*m的矩形,光线从(0,0)出发,沿右上方向以每秒根号2米的速度运动,碰到矩形边界就会反弹(符合物理规律的反弹),询问k个点,这些点都在矩形内部且不在矩形边界上,求光经过这些点 ...
- [P1082][NOIP2012] 同余方程 (扩展欧几里得/乘法逆元)
最近想学数论 刚好今天(初赛上午)智推了一个数论题 我屁颠屁颠地去学了乘法逆元 然后水掉了P3811 和 P2613 (zcy吊打集训队!)(逃 然后才开始做这题. 乘法逆元 乘法逆元的思路大致就是a ...
- code1213 解的个数 扩展欧几里得
很不错的题,加深了我对exgcd的理解 (以前我认为做题就是搜索.dp...原来数学也很重要) 理解了几个小时,终于明白了.但我什么都不打算写. 看代码吧: #include<iostream& ...
随机推荐
- Linux 命令 - cd: 切换工作目录
命令格式 cd [directory] 实例 a) 将工作目录切换成主目录. cd # 或 cd ~ b) 将工作目录切换成当前工作目录的父目录. cd .. c) 将工作目录切换成上一个的工作目录. ...
- Cocos2d-x开发实例介绍帧动画使用
下面我们通过一个实例介绍一下帧动画的使用,这个实例如下图所示,点击Go按钮开始播放动画,这时候播放按钮标题变为Stop,点击Stop按钮可以停止播放动画. 下面我们再看看具体的程序代码,首先看一下看H ...
- <Error>: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
转自这里 出 错原因:设置app的状态栏样式的使用使用了旧的方式,在info.plist里面设置了View controller- based status bar appearance为NO,默 ...
- UGUI之在场景中设置、修改标签和按钮
UnityGUI使用一个特殊的OnGUI()函数,在该函数中加入实现UI的脚本. 它一共有两种类型的接口:GUI.xxx()和GUILayout.xxx(). 第一种需要自动手写填写处于屏幕上的位置. ...
- 暑假集训(5)第二弹———湫湫系列故事——减肥记I(hdu4508)
问题描述:舔了舔嘴上的油渍,你陷在身后柔软的靠椅上.在德源大赛中获得优胜的你,迫不及待地赶到“吃到饱”饭店吃到饱.当你 正准备离开时,服务员叫住了你,“先生,您还没有吃完你所点的酒菜.”指着你桌上的一 ...
- 09_rlCoachKin讲解
在Socket.cpp中Socket::readClient()函数中就是解析读取到的内容的. 对于我们发送的2 0 1.57 0.31 0 0 1.57 0,那么就会进入如下分支: 也就是进入2号处 ...
- qml实现窗口拖动
在去掉窗口标题栏后窗口会失去鼠标拖动效果,所以需要自己添加拖动效果. 实现代码: ApplicationWindow { id: mainWindow visible: true ...
- DTCMS自定义标签,tags分割
DTcms.Web.UI\Label\article.cs /// <summary> /// 自定义:分割tags /// </summary> /// <param ...
- 指针之 *((volatile unsigned long *)(x))解析
今天重新温习了一下C语言的指针部分,突然想到了经常会碰见的一种宏定义:#define PGAS (*((volatile unsinged long *)(x))) 在解析该宏定义前,先看看指针变量的 ...
- bower——库管理工具
bower了解: 随着网页功能的复杂化,各种网页效果的实现,现在单一的一个或两个库文件或许已经不能够满足我们的需要,但当有很多的库文件的时候,手动编辑已经不能胜任,对于引入的库文件而言,往往都是牵一发 ...