注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

n+e

NewWeb:http://trinkle.is-programmer.com/

 
 
 

日志

 
 

[BZOJ3813]奇数国  

2015-01-05 20:30:00|  分类: BZOJ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

3813: 奇数国

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 109  Solved: 68
[Submit][Status]

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

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

Sample Input

6
0 1 3
1 1 5
0 1 3
1 1 7
0 1 3
0 2 3

Sample Output

18
24
36
6

explanation

初始化每个国家存款都为3;
1到3的product为27,[1,27]与27不相冲的有18个数;
1的存款变为5;
1到3的product为45,[1,45]与45不相冲的有24个数;
1的存款变为7;
1到3的product为63,[1,63]与63不相冲的有36个数;
2到3的product为9,[1,9]与9不相冲的有6个数。

HINT

x≤100000,当ai=0时0≤ci?bi≤100000

Solution

题意就是要求写一个数据结构,支持单点修改,区间查询欧拉函数的值。

开始的时候想对于60个质数,开60棵线段树记录幂数,最后用快速幂乘起来就好了。不过被卡了过不去T T

其实只要建两棵线段树就好了,一颗维护乘积,另一颗维护当前区间的乘积包含哪些质因数,用一个long long给它压起来,因为60<64。维护的话,mul[o]=mul[o<<1]*mul[o<<1|1]%p,state[o]=state[o<<1]|state[o<<1|1]

最后查询的时候只要看state,如果一个质数有出现在这里面,ans*=(pi-1)/pi,而(pi-1)/pi是可以预处理的。于是复杂度上的*60就变成了+60

Code

/**************************************************************
    Problem: 3813
    User: wjy1998
    Language: C++
    Result: Accepted
    Time:1416 ms
    Memory:5964 kb
****************************************************************/
 
#include<cstdio>
#include<algorithm>
#include<cmath>
inline int getc(){
    static char buf[1<<15],*S=buf,*T=buf;
    if(S==T)if(T=(S=buf)+fread(buf,1,1<<15,stdin),S==T)return 0;
    return*S++;
}
int aa,ch;inline int F(){
    while(ch=getc(),ch<48||ch>57);aa=ch-48;
    while(ch=getc(),ch>47&&ch<58)aa=aa*10+ch-48;return aa;
}
char buf[1<<20],*O=buf,stk[100];int ts;
inline void P(long long x){
    if(!x)*O++=48;
    else{
        for(ts=0;x;x/=10)stk[++ts]=x%10;
        for(;ts;*O++=48+stk[ts--]);
    }
    *O++='\n';
}
#define p 19961993
#define ll long long
int n,i,j,tmp[70],prime[70],tot,vis[300],d=1<<17;ll t[1<<18],s[1<<18],op,x,y,st,ans,inv[70];
ll power(ll t,ll k){ll f=1;
    for(;k;k>>=1,t=1LL*t*t%p)k&1?f=1LL*f*t%p:1;
    return f;
}
int main(){
    for(i=2;i<=281;i++)if(!vis[i])
    for(inv[tot]=(i-1)*power(i,p-2)%p,prime[tot]=i,tot++,j=i;j<=281;j+=i)vis[j]=1;
    for(i=1;i<=100000;i++)t[i+d]=3,s[i+d]=2;
    for(i=d-1;i;i--)s[i]=s[i<<1]|s[i<<1|1],t[i]=t[i<<1]*t[i<<1|1]%p;
    for(n=F();n--;)
    if(!F()){
        for(st=0,ans=1,x=F()+d-1,y=F()+d+1;x^y^1;x>>=1,y>>=1)
        ~x&1?st|=s[x^1],ans=ans*t[x^1]%p:1,y&1?st|=s[y^1],ans=ans*t[y^1]%p:1;
        for(i=0;i<60;i++,st>>=1)if(st&1)ans=ans*inv[i]%p;
        P(ans);
    }else{
        for(x=F(),y=F(),t[x+d]=y,s[x+d]=i=0;i<60;i++)if(y%prime[i]==0)s[x+d]|=1LL<<i;
        for(x+=d;x>>=1;t[x]=t[x<<1]*t[x<<1|1]%p,s[x]=s[x<<1]|s[x<<1|1]);
    }
    *--O=0,puts(buf);
}
  评论这张
 
阅读(108)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018