Description

  在一片美丽的大陆上有100000个国家,记为1到100000。这里经济发达,有数不尽的账房,并且每个国家有一个银行。某大公司的领袖在这100000个银行开户时都存了3大洋,他惜财如命,因此会不时地派小弟GFS清点一些银行的存款或者让GFS改变某个银行的存款。该村子在财产上的求和运算等同于我们的乘法运算,也就是说领袖开户时的存款总和为3100000。这里发行的软妹面额是最小的60个素数(p1=2,p2=3,…,p60=281),任何人的财产都只能由这60个基本面额表示,即设某个人的财产为fortune(正整数),则fortune=p1^k1*p2^k2*......p60^K60。
  领袖习惯将一段编号连续的银行里的存款拿到一个账房去清点,为了避免GFS串通账房叛变,所以他不会每次都选择同一个账房。GFS跟随领袖多年已经摸清了门路,知道领袖选择账房的方式。如果领袖选择清点编号在[a,b]内的银行财产,他会先对[a,b]的财产求和(计为product),然后在编号属于[1,product]的账房中选择一个去清点存款,检验自己计算是否正确同时也检验账房与GFS是否有勾结。GFS发现如果某个账房的编号number与product相冲,领袖绝对不会选择这个账房。怎样才算与product不相冲呢?若存在整数x,y使得number*x+product*y=1,那么我们称number与product不相冲,即该账房有可能被领袖相中。当领袖又赚大钱了的时候,他会在某个银行改变存款,这样一来相同区间的银行在不同的时候算出来的product可能是不一样的,而且领袖不会在某个银行的存款总数超过1000000。
  现在GFS预先知道了领袖的清点存款与变动存款的计划,想请你告诉他,每次清点存款时领袖有多少个账房可以供他选择,当然这个值可能非常大,GFS只想知道对19961993取模后的答案。

Input

  第一行一个整数x表示领袖清点和变动存款的总次数。
  接下来x行,每行3个整数ai,bi,ci。ai为0时表示该条记录是清点计划,领袖会清点bi到ci的银行存款,你需要对该条记录计算出GFS想要的答案。ai为1时表示该条记录是存款变动,你要把银行bi的存款改为ci,不需要对该记录进行计算。

Output

  输出若干行,每行一个数,表示那些年的答案。‘

  看到这题,我们先不去管别的。。先把题意看懂!(说多了都是泪啊QAQ)
  然后我们想一想,如果ax+by=1(a<b)的x,y的解,就说明gcd(a,b)==1.
  那么就是求phi[b]..
  然后就是维护区间的积?就是线段树啦。。
  然后还可以维护一个区间的积的因数有哪些?不过好像很麻烦?
  我们一算,60个质数,恩,1<<60,恩,没爆long long?
  好吧,就是状态压缩一下吧。。之后用欧拉函数的因数求解方式。。
  然后就ok啦。。说的这么简单,代码真是要爆炸了。。
  

 #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:奇数国的更多相关文章

  1. 【数学/扩展欧几里得/线性求逆元】[Sdoi2008]沙拉公主的困惑

    Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...

  2. 【数学/扩展欧几里得/Lucas定理】BZOJ 1951 :[Sdoi 2010]古代猪文

    Description “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边 ...

  3. 洛谷P3951 小凯的疑惑 - 数学 /扩展欧几里得

    传送门 题意:求出a和b不能通过线性组合(即n*a+m*b)得到的最大值: 思路:摘自洛谷: 不妨设 a<b 假设答案为 x 若 x≡m*a ( mod b )(1≤m≤b−1) (mod3)什 ...

  4. 【数学】【NOIp2012】同余方程 题解 以及 关于扩展欧几里得与同余方程

    什么是GCD? GCD是最大公约数的简称(当然理解为我们伟大的党也未尝不可).在开头,我们先下几个定义: ①a|b表示a能整除b(a是b的约数) ②a mod b表示a-[a/b]b([a/b]在Pa ...

  5. interesting Integers(数学暴力||数论扩展欧几里得)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwwAAAHwCAIAAACE0n9nAAAgAElEQVR4nOydfUBT1f/Hbw9202m0r8

  6. UVa 11768 格点判定(扩展欧几里得求线段整点)

    https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后 ...

  7. C. Ray Tracing——披着搜索外衣的扩展欧几里得

    [题目大意] 给你一个n*m的矩形,光线从(0,0)出发,沿右上方向以每秒根号2米的速度运动,碰到矩形边界就会反弹(符合物理规律的反弹),询问k个点,这些点都在矩形内部且不在矩形边界上,求光经过这些点 ...

  8. [P1082][NOIP2012] 同余方程 (扩展欧几里得/乘法逆元)

    最近想学数论 刚好今天(初赛上午)智推了一个数论题 我屁颠屁颠地去学了乘法逆元 然后水掉了P3811 和 P2613 (zcy吊打集训队!)(逃 然后才开始做这题. 乘法逆元 乘法逆元的思路大致就是a ...

  9. code1213 解的个数 扩展欧几里得

    很不错的题,加深了我对exgcd的理解 (以前我认为做题就是搜索.dp...原来数学也很重要) 理解了几个小时,终于明白了.但我什么都不打算写. 看代码吧: #include<iostream& ...

随机推荐

  1. android代码设置、打开WLAN wifi热点及热点的连接

    其实创建热点很简单,先获取到wifi的服务,再配置热点名称.密码等等,然后再通过反射打开它就OK了. 下面我们看看创建热点的代码实现: 这一段是开启WLAN热点,并可以指定好它的热点名和密码 支行后, ...

  2. 第三十一篇、iOS 9版本适配

    1.网络适配(强制回退HTTP) 为了强制增强数据访问安全, iOS9 默认会把 所有的http请求 所有从NSURLConnection . CFURL . NSURLSession发出的 HTTP ...

  3. 对JavaScript莫名的愤怒

    很多时候,我都察觉JavaScript有一中描述性语言的特性,为了实现他的功能,在浏览器中完美的发挥作用,他就像是一个巨型的工厂工程模式,外挂了很多API和功能集,他们试图用完美的方案去解释所有必须的 ...

  4. nodejs包管理

    包管理 :npm cnpm yarn Node Package Manager node的包管理工具 cls清除控制台 npm install jquery 下载依赖包 就自动下载最新版本的jq np ...

  5. zabbix3.0.3 设置邮件报警

    在zabbix3.0.3 设置报警这里卡了两天.终于解决了,这里我使用的mailx来作为发送邮件的客户端 1.设置mailx发信账号 yum -y install mailx ln -s /bin/m ...

  6. libnet发包例子(tcp udp arp广播)

    #include <libnet.h> int main() { libnet_t *handle; /* Libnet句柄 */ int packet_size; /* 构造的数据包大小 ...

  7. JPA && Spring Data && Spring Data JPA

    1.JPA  Java Persistence API,用于对象持久化的一组API,JPA本身是一组规范,让开发者用同一种方式访问不同的ORM框架.其实也就是java实体对象和关系型数据库建立起映射关 ...

  8. undefined local variable or method ‘xxx’ for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0xbc88d6c>错误解决方案

    官方文档如下: https://github.com/rspec/rspec-rails/blob/master/Capybara.md Capybara 2.0 To use Capybara 2. ...

  9. [译]Java Thread join示例与详解

    Java Thread join示例与详解 Java Thread join方法用来暂停当前线程直到join操作上的线程结束.java中有三个重载的join方法: public final void ...

  10. linux实现nginx按照日期存储日志

    通过shell脚本实现+定时任务+nginx信号管理实现日志按日期存储. 1.编写shell脚本,实现日志按日期存储 #!/bin/bash base_path='/home/wwwlogs/' lo ...