3813: 奇数国|树状数组|欧拉函数

题目显然让求

φ(∏i=lrai)

可以用线段树维护一下乘积然后求逆元再求欧拉函数,用压位的方法可以缩小60倍的常数。考虑一下树状数组的做法,因为只有60个质因子,所以可以开60个树状数组维护每一个质因子,最初维护了前缀的乘积然后T飞了。因为乘法比起加法还是比较慢的所以可以维护一个前缀的指数和,这样就可以在BZOJ成功卡进最后一页QAQ,然而UOJ的Extra Test还是过不了(应该是我写的代码太丑的原因吧。。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define ll long long
#define mod 19961993
#define N 100001
using namespace std;
int sc()
{
    int i=0,f=1; char c=getchar();
    while(c>‘9‘||c<‘0‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘)i=i*10+c-‘0‘,c=getchar();
    return i*f;
}
int prime[66],inv[66],b[300],top;
int tr[61][N],n,Q,a[N],flag;
ll cal(ll x,ll y)
{
    ll ans=1;
    for(;y;x=x*x%mod,y>>=1)
        if(y&1)ans=ans*x%mod;
    return ans;
}
void change(int x,int y,ll v)
{
    for(;y<N;y+=y&-y)tr[x][y]+=v;
}
ll ask(int  x,int y)
{
    ll ans=0;
    for(;y;y-=y&-y)ans+=tr[x][y];
    return ans;
}
void solve(int p,ll x,int i,int f)
{
    ll now=0;
    while(x%prime[i]==0)x/=prime[i],now++;
    change(i,p,f*now);
}
int main()
{
    for(int i=2;i<=281;i++)
        if(!b[i])
        {
            prime[++top]=i;inv[top]=cal(prime[top],mod-2);
            for(int j=2*i;j<=281;j+=i)b[j]=1;
        }
    for(int i=1;i<N;i++)change(2,i,1),a[i]=3;
    Q=sc();
    while(Q--)
    {
        if(sc())
        {
            int x=sc(),y=sc();
            for(int i=1;i<=60;i++)
            {
                if(a[x]%prime[i]==0) solve(x,a[x],i,-1);
                if(y%prime[i]==0) solve(x,y,i,1);
            }
            a[x]=y;
        }
        else
        {
            int l=sc(),r=sc();
            ll ans=1;
            for(int i=1;i<=60;i++)
            {
                ll res=ask(i,r)-ask(i,l-1);
                if(res)
                    ans=ans*cal(prime[i],res-1)*(prime[i]-1)%mod;
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}
时间: 2024-11-06 03:04:19

3813: 奇数国|树状数组|欧拉函数的相关文章

Codeforces 597C. Subsequences (树状数组+dp)

题目链接:http://codeforces.com/contest/597/problem/C 给你n和数(1~n各不同),问你长为k+1的上升自序列有多少. dp[i][j] 表示末尾数字为i 长度为j的上升子序列个数,但是dp数组是在树状数组的update函数中进行更新. update(i, val, j)函数表示在i的位置加上val,更新dp[i][j]. sum(i, j)就是求出末尾数字小于等于i 且长度为j的子序列有多少个. 1 //#pragma comment(linker,

ZOJ 2112 Dynamic Rankings(主席树套树状数组+静态主席树)

题意:给定一个区间,求这个区间第k大的数,支持单点修改. 思路:主席树真是个神奇的东西.........速度很快但是也有一个问题就是占用内存的很大,一般来说支持单点修改的主席树套树状数组空间复杂度为O(n*logn*logn), 如果查询较少的话,可以初始的时候用一颗静态主席树,这样空间复杂度可以降为O(n*logn+q*logn*logn),勉强可以过zoj这道题. 这道题看了好久好久才懂...网上题解一般就几句话.......下面是自己的一些理解. 首先静态主席树这个东西其实比较好懂,就是对

ZOJ 2112 Dynamic Rankings(树状数组+主席树)

The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with the query like to simply find the k-th smallest number of the given N numbers. They have developed a more powerful system such that for N numbers a[1],

欧拉函数及其性质

对正整数n,欧拉函数是 <= n的数中与n互质的数的数目. 例如euler(8)=4,因为1,3,5,7均和8互质. Euler函数表达通式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)-(1-1/pn),其中p1,p2--pn为x的所有素因数,x是不为0的整数.euler(1)=1(唯一和1互质的数就是1本身). 欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2. 特殊性质:当n为奇数时,φ(2n)=φ(n) 欧拉函数是积性函数--若m,

学习笔记:欧拉函数

欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 通式:φ(x)=x*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数.φ(1)=1(唯一和1互质的数就是1本身). 对于质数p,φ(p) = p - 1.注意φ(1)=1. 欧拉定理:对于互质的正整数a和n,有aφ(n) ≡ 1 mod n. 欧拉函数是积性函数(不完全)——若m,n互质,φ(mn)=φ

BZOJ 3813 奇数国 欧拉函数+线段树+乘法逆元

题目大意:给出一个序列,支持修改操作,求这个序列连续一段的乘积的欧拉函数.每个数的最大质因子不超过281. 思路:φ(n) = n * (1 - 1 / p1) * (1 - 1 / p2) * (1 - 1 / p3) * (1 - 1 / p4)--*(1 - 1 / pn) = n  / (p1 * p2 * p3 * -- * pn) * ((p1 - 1) * (p2 - 1) * (p3 - 1) * -- * (pn - 1)) 于是这个东西只需要维护一下区间中的指数,用bitse

[bzoj3813] 奇数国 [线段树+欧拉函数]

题面 传送门 思路 这题目是真的难读......阅读理解题啊...... 但是理解了以后就发现,题目等价于: 给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993取模 这里是欧拉函数的原因显然,题目中的那个不相冲实际上就是扩展欧几里得里面的那个定理,要满足不相冲(也就是方程有解),\(product\)和\(number\)必须互质 序列当中,每个元素大小不超过1e6,质因数都是前60个 那么我们显然可以开一棵线段树来维护这个区间乘积,但是怎么处理欧拉函数呢

清华集训 2014--奇数国(线段树&amp;欧拉函数&amp;乘法逆元&amp;状态压缩)

昨天想了一晚...早上AC了... 这么长时间没打线段树,这回居然一次过了... 感觉数论方面应该已经没有太大问题了... 之后要开始搞动态规划之类的东西了... 题意 在一片美丽的大陆上有100000个国家,记为1到100000.这里经济发达,有数不尽的账房,并且每个国家有一个银行.某大公司的领袖在这100000个银行开户时都存了3大洋,他惜财如命,因此会不时地派小弟GFS清点一些银行的存款或者让GFS改变某个银行的存款.该村子在财产上的求和运算等同于我们的乘法运算,也就是说领袖开户时的存款总

UESTC 912 树上的距离 --LCA+RMQ+树状数组

1.易知,树上两点的距离dis[u][v] = D[u]+D[v]-2*D[lca(u,v)] (D为节点到根节点的距离) 2.某条边<u,v>权值一旦改变,将会影响所有以v为根的子树上的节点到根节点的距离,很明显,DFS一遍后以v为根的子树在DFS序列中是连续的一段,及转化为区间更新问题,可以用树状数组. 做法:先把求LCA解决,LCA可以转化为RMQ问题,可参见:LCA转RMQ, 即转化为LCA(T,u,v) = RMQ(B,pos[u],pos[v]),其中B为深度序列.预先DFS可以处