3813: 奇数国

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 748  Solved: 425
[Submit][Status][Discuss]

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
013
115
013
117
013
023

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

Source

  这是一道好题啊……
  题目里的每一句话都暗藏玄机……
  题目关键点在于number与product的关系,number*x+product*y=1的条件就是他们互质,所以我们实际要求的是porduct的欧拉函数。当然了,线筛肯定滚粗,我们还得看题目。他说任何人的财产都可以用那60个素数表示,良心啊。这样我们就可以用唯一分解来求欧拉函数了。
  但是,问题在于我们怎么去求他的因子呢?线段树求出来的是在模完之后的,不可能通过它去求。所以我们还得维护一下因子。
  由于博主太过蒟蒻,所以傻乎乎的拿了一个bool数组去存,然后T到死……
  没办法,只能怂一波。万万没想到,一个long long就可以解决了。不知道大家有没有对本题涉及到的质数的个数60感到好奇呢?是的,long long极限是2^63-1,所以long long状压刚好可以,所以我们只要在线段树里用一个long long状压表示因子有谁就好了。
 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <vector>
#define N 100005
using namespace std;
int n,p=;
long long ksm(long long x,long long z)
{
long long ans=;
while(z)
{
if(z&)
{
ans*=x;
ans%=p;
}
x*=x;x%=p;
z>>=;
}
return ans;
}
int zz,ss[];
struct no{
int left,right,mid;
long long data,pp;
}node[N*];
void build(int left,int right,int x)
{
node[x].left=left,node[x].right=right;
node[x].pp|=(<<1ll);
if(left==right)
{
node[x].data=;
return;
}
int mid=(left+right)>>;
node[x].mid=mid;
build(left,mid,x*);
build(mid+,right,*x+);
node[x].data=node[*x].data*node[*x+].data;
node[x].data%=p;
}
void change(int to,int x,long long z)
{
if(node[x].left==node[x].right)
{
node[x].data=z;
node[x].pp=;
for(int i=;i<=zz;i++)
{
if(z%ss[i]==) node[x].pp|=(1ll<<(i-1ll));
}
return;
}
int mid=node[x].mid;
if(to>mid)change(to,*x+,z);
else change(to,*x,z);
node[x].data=node[*x].data*node[*x+].data;
node[x].data%=p;
node[x].pp=node[*x].pp|node[*x+].pp;
}
long long pp;
long long get(int left,int right,int x)
{
if(node[x].left==left&&node[x].right==right)
{
pp|=node[x].pp;
return node[x].data;
}
int mid=node[x].mid;
if(left>mid)return get(left,right,*x+);
else if(right<=mid)return get(left,right,*x);
else return get(left,mid,*x)*get(mid+,right,*x+)%p;
}
long long ni[];
void init()
{
for(int i=;zz<;i++)
{
zz++;
ss[zz]=i;
for(int j=;j<=sqrt(i);j++)
{
if(i%j==)
{
ss[zz]=;
zz--;
break;
}
}
}
for(int i=;i<=;i++)ni[i]=ksm(ss[i],p-);
}
int main()
{
init();
scanf("%d",&n);
build(,,);
for(int i=;i<=n;i++)
{
int op;
scanf("%d",&op);
if(op)
{
long long x,y;
scanf("%lld%lld",&x,&y);
change(x,,y);
}
else
{
long long x,y;
pp=;
scanf("%d%d",&x,&y);
long long pro=get(x,y,);
long long ans=pro;
for(int i=;i<=zz;i++)
{
if(pp&(1ll<<(i-1ll)))
{
ans*=ni[i];
ans%=p;
ans*=(ss[i]-);
ans%=p;
}
}
printf("%lld\n",ans);
}
}
return ;
}

Bzoj 3813 奇数国 题解 数论+线段树+状压的更多相关文章

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

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

  2. [BZOJ 3813]奇数国

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

  3. hdu 5023 线段树+状压

    http://acm.hdu.edu.cn/showproblem.php?pid=5023 在片段上着色,有两种操作,如下: 第一种:P a b c 把 a 片段至 b 片段的颜色都变为 c . 第 ...

  4. POJ:2777-Count Color(线段树+状压)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Description Chosen Problem Solving and Program d ...

  5. POJ 3468 线段树+状压

    题意:给你n个数,有对区间的加减操作,问某个区间的和是多少. 思路:状压+线段树(要用lazy标记,否则会TLE) //By SiriusRen #include <cstdio> #in ...

  6. HDU_3071 Gcd & Lcm game 【素数分解 + 线段树 + 状压】

    一.题目  Gcd & Lcm game 二.分析 非常好的一题. 首先考虑比较暴力的做法,肯定要按区间进行处理,对于$lcm$和$gcd$可以用标准的公式进行求,但是求$lcm$的时候是肯定 ...

  7. poj2777Count Color——线段树+状压

    题目:http://poj.org/problem?id=2777 状压每个颜色的选择情况,取答案时 | 一番: 注意题目中的区间端点可能大小相反,在读入时换一下位置: 注意pushdown()中要l ...

  8. 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...

  9. Bzoj 1756: Vijos1083 小白逛公园 线段树

    1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1021  Solved: 326[Submit][Statu ...

随机推荐

  1. .NET与 java通用的3DES加密解密方法

    C#代码 private void button1_Click(object sender, EventArgs e) { string jiami = textBox1.Text; textBox2 ...

  2. Python标准库(3.x): itertools库扫盲

    itertools functions accumulate() compress() groupby() starmap() chain() count() islice() takewhile() ...

  3. List遍历删除 或取指定的前N项

    class Program { static void Main(string[] args) { /* * List遍历删除 或取指定的前N项 */ List<PerSon> listP ...

  4. 赵伟国:陆资无法进入台湾紫光要到WTO控告(芯片是为了经济安全,高通找的人不是很聪明)

    集微网消息,昨天由全球半导体联盟和上海市集成电路行业协会联合举办的Memory +论坛在上海举行,会议透过来自存储器.逻辑和系统市场领先企业的高管,深入他们对未来存储器的应用.可行的商业模式,以及逻辑 ...

  5. mfc开发an unsupported operation was attempted错误解决

    mfc开发删除了一个控件后,没有删除该控件对应的id和代码导致 觉得mfc真xx 在资源编辑可视化界面手动删除一个控件后,resource.h里该控件的ID竟然还存在 因为该id还存在,调用该控件的代 ...

  6. 微信小程序把玩(三十九)navigation API

    原文:微信小程序把玩(三十九)navigation API 演示效果也看到了小程序也就提供这几个处理导航控制.值得注意的是只能同时导航五个页面 主要属性: 导航条一些方法 wx.setNavigati ...

  7. 【Python】:用python做下百度2014笔试题

    国庆节最后一天,明天就要上班了,闲来无事做做百度2014笔试题,好久没用过C++了,索性就用python简单的写一下,体验下题目难度.题目是从[大卫David]那里copy过来的. 1.给定任意一个正 ...

  8. 程序的开机关机重启,开机启动,休眠功能delphi实现(使用AdjustTokenPrivileges提升权限)

    TShutDownStatus = (sdShutDown,sdReboot,sdLogOff,sdPowerOff); procedure ShutDown(sdStatus : TShutDown ...

  9. 重写QLineEdit,实现编辑框内添加删除按钮的功能(随时把控件Move到一个地方,然后show就可以了,这是万能的办法)

    http://www.qtcn.org/bbs/read-htm-tid-62265-ds-1-page-1.html#180286

  10. 发布Qt Quick桌面应用程序的方法(使得planets在XP上运行)

    发布Qt Quick桌面应用程序的方法 Qt是一款优秀的跨平台开发框架,它可以在桌面.移动平台以及嵌入式平台上运行.目前Qt 5介绍程序发布的文章帖子比较少.大家又非常想要知道如何发布Qt应用程序,于 ...