HYSBZ - 3813奇数国

  中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的。所以我们要求互质数的话,得用到所有金额都用60个素数表示的这个条件。也就是x=p1a1xp2a2x...p60a60表示,pi是第i个素数,ai是对应的指数,这就变成了互质素求欧拉函数,可以先了解一下欧拉函数,引用一下境外大佬的博客欧拉函数的讲解我们需要用到这一条

p为质数

1. phi(p)=p-1   因为质数p除了1以外的因数只有p,故1至p的整数只有p与p不互质 

2. 如果i mod p = 0, 那么 phi(i * p)=phi(i) * p

3.若i mod p ≠0,  那么 phi( i * p )=phi(i) * ( p-1 ) 

  首先,如果我们要求phi(p1a1)的话,p1是质数,然后p1a1=p1a1-1*p1,而p1a1-1 mod p1=0,所以phi(p1a1)=phi(p1a1-1)*p1,又phi(p1a1-1)=phi(p1a1-2)*p1,一直到,phi(p1)=p1-1,所以phi(p1a1)=p1a1-1*(p1-1),

  然后求phi(p1a1*p2),p1a1 mod p2≠0,所以phi(p1a1*p2)=phi(p1a1)*(p2-1),再算phi(p1a1*p22),p1a1*p22 mod p2=0,所以phi(p1a1*p22)=phi(p1a1*p2)*p2,所以这样推下去的话,phi(p1a1*p2a2)=p1a1-1*(p1-1)*p2a2-1*(p2-1)

  我们可以得到phi(p1a1xp2a2x...p60a60)=p1a1-1*(p1-1)*p2a2-1*(p2-1)*...*p60a60-1*(p60-1)。

  因为它说这个国家的加法就是我们的乘法,所以我们可以用树状数组或者线段树来维护1~100000里存储的每个数对应的素数的次方,但第二苟的点来了,如果用线段树还好说,只要处理好懒标记就应该可以了,但是用树状数组,单点更新那里一不小心就会超时,超时了好几发后,我看学长的代码原来他们的树状数组也是9492ms险过的,先看AC代码,更新处是使用学长的处理。

 #include<cstdio>
#define lowb(x) x&(-x)
#define ll long long
const int N=;
const ll mod=;
int a[N+][]={},b[N],prime[]={
,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,
,,,,,,,,,,,};//我自己把素数打出来了
void updata(int x,int y,int z)
{
while(x<=N)
{
a[x][y]+=z;
x+=lowb(x);
}
}
int geta(int x,int y)
{
int ans=;
while(x)
{
ans+=a[x][y];
x-=lowb(x);
}
return ans;
}
void modify(int x,int y,int flag)
{
for(int i=;i<=;i++)//把价值转化成p1^a1+p2^a2+p3^a3+...+p60^a60的形式,然后存储指数ai
if(y%prime[i]==)
{
int z=;
while(y%prime[i]==)
{
z++;
y/=prime[i];
}
updata(x,i,flag*z);
}
}
ll pow(ll a,int b)
{
ll ans=;
a%=mod;
while(b)
{
if(b&)
ans=(ans*a)%mod;
a=(a*a)%mod;
b>>=;
}
return ans;
}
int main()
{
int n,op,x,y,z;
scanf("%d",&n);
for(int i=;i<=N;i++)
{
b[i]=;
updata(i,,);//3是第二个素数,一开始每个都有3块钱
}
while(n--)
{
scanf("%d%d%d",&op,&x,&y);
if(op)
{
modify(x,b[x],-);//先减去原来的数
modify(x,y,);//再加上要修改的数
b[x]=y;
}
else
{
ll ans=;
for(int i=;i<=;i++)
{
z=geta(y,i)-geta(x-,i);
if(z)
ans=ans*pow(1ll*prime[i],z-)*(prime[i]-)%mod;
}
printf("%lld\n",ans);
}
}
return ;
}

学长好腻害哦

  学长的处理就是,保存好每一个原来的存款,然后每次更新时,先减去旧的存款然后再加上新的存款,而我的处理的话是

 for(int i=;i<=;i++)
{
z=;
while(y%prime[i]==)
{
z++;
y/=prime[i];
}
z=z-a[x][i];//原来新的指数和对旧的指数差值,正的说明要加上,负的说明要减去,0不需要更新
if(z!=)
  updata(x,i,z);
}

  我觉得我这样每个i只进行了一次更新,应该比学长的更快,然而T了,我觉得原因应该是在于如果z不是0的话,那么我的就是60遍每次都要从x节点更新到100000为止,但学长的看上去是跑了两边,但是if(y%prime[i]==0)这一句过滤掉很多没必要的更新,所以还是学长nb啊。。。

  至于线段树的做法,先留个坑,毕竟女同志能顶半边天。

HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)的更多相关文章

  1. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  2. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  3. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  4. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  6. 「10.10」神炎皇(欧拉函数)·降雷皇(线段树,DP)·幻魔皇

    A. 神炎皇 很好的一道题,可能第一次在考场上遇到欧拉函数 题意:对于一个整数对 $(a,b)$,若满足 $a\times b\leq n$且$a+b$是$a\times b$的因子, 则称为神奇的数 ...

  7. 数据结构--树状数组&&线段树--基本操作

    随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...

  8. hdu 1166 树状数组(线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. 树状数组&线段树

    先是树状数组. 令这棵树的结点编号为C1,C2...Cn.令每个结点的值为这棵树的值的总和,那么容易发现: C1 = A1 C2 = A1 + A2 C3 = A3 C4 = A1 + A2 + A3 ...

随机推荐

  1. docker-Overlay原生网络

    节点1/键值存储:192.168.50.130 :192.168.50.131 1.下载Consul二进制包并启动 wget https://releases.hashicorp.com/consul ...

  2. kettle处理未发现hadoop插件问题

    背景:将测试环境的中kettle转换传输到生产环境上出现hadoop插件无法获取的错误 Hadoop File Output 2.0 - ERROR (version 7.1.0.0-12, buil ...

  3. zookeeper初识

    ZOOKEEPER是为分布式系统提供高性能的协调工具 角色: 1.领导者(leader):负责进行投票的发起和决议,更新系统状态2.学习者(learner):包括跟随者(follower)和观察者(o ...

  4. 【原创】大数据基础之ETL vs ELT or DataWarehouse vs DataLake

    ETL ETL is an abbreviation of Extract, Transform and Load. In this process, an ETL tool extracts the ...

  5. Pytorch中nn.Dropout2d的作用

    Pytorch中nn.Dropout2d的作用 首先,关于Dropout方法,这篇博文有详细的介绍.简单来说, 我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更 ...

  6. Sql Server 导出数据库表结构的SQL查询语句

    --导出数据库所有表 SELECT 表名 Then D.name Else '' End, 表说明 Then isnull(F.value,'') Else '' End, 字段序号 = A.colo ...

  7. shell脚本视频学习2

    一.函数 1.函数格式 2.函数传入参数 3.手动输入函数中的参数 4.函数返回值 成功返回0,失败返回1 5.输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名, ...

  8. sql分页查询(2005以后的数据库)和access分页查询

    sql分页查询: select * from ( select ROW_NUMBER() over(order by 排序条件) as rowNumber,* from [表名] where 条件 ) ...

  9. eclipse+springboot+tomcat自带的部署

    最近在看微服务,然后整理了两个springboot.但执行都是内部main执行,想着后期应该会用到tomcat,大部分都是说的打成war包,然后部署到tomcat上. war包的方式就不说了,网上很多 ...

  10. CF888G Xor-MST[最小生成树+01trie]

    前注:关于这题,本人的解法暂时没有成功通过此题,原因是被卡常了.可能需要等待某种机缘来请人调试. 类似uoj的一道题(新年的繁荣),不过是一个有些简单的版本. 因为是完全图,有没有办法明显优化建边,所 ...