http://www.lydsy.com/JudgeOnline/problem.php?id=4869

终于A了。。。参考了下dalao的代码。。。

拓展欧几里得定理,改了几次就不变了,但是用的时候要在快速幂里判是不是要用。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
int n, m, cnt;
ll p, c;
ll phi[N], table[N];
namespace seg // n^x = n^(x % phi[x] + phi[x])
{
struct data {
ll ans, mn;
} tree[N << ];
inline ll getphi(ll x)
{
ll ret = x, lim = x;
for(ll i = ; i * i <= lim; ++i) if(x % i == )
{
ret = ret * (i - ) / i;
while(x % i == ) x /= i;
}
// printf("ret=%d\n", ret);
if(x > ) ret = ret * (x - ) / x;
return ret;
}
inline ll power(ll x, ll t, ll p, bool &flag)
{
bool big = false;
ll ret = ;
for(; t; t >>= )
{
if(t & )
{
ret = ret * x ;
flag |= big | (ret >= p);
ret %= p;
}
x = x * x; if(x >= p) big = true, x %= p;
}
return ret;
}
ll calc(ll x, int t)
{
if(x >= phi[t]) x = x % phi[t] + phi[t];
for(int i = t - ; i >= ; --i)
{
bool flag = false;
x = power(c, x, phi[i], flag);
if(flag) x += phi[i];
}
return x % phi[];
}
inline void build(int l, int r, int x)
{
if(l == r) {
tree[x].ans = table[l];
return;
}
int mid = (l + r) >> ;
build(l, mid, x << );
build(mid + , r, x << | );
tree[x].ans = (tree[x << ].ans
+ tree[x << | ].ans) % phi[];
}
inline void update(int l, int r, int x, int a, int b)
{ //如果这次的幂和上次一样就不变了
if(tree[x].mn >= cnt) return;
if(l > b || r < a) return;
if(l == r)
{
++tree[x].mn;
tree[x].ans = calc(table[l], tree[x].mn);
return;
}
int mid = (l + r) >> ;
update(l, mid, x << , a, b);
update(mid + , r, x << | , a, b);
tree[x].mn = min(tree[x << ].mn,
tree[x << | ].mn);
tree[x].ans = (tree[x << ].ans +
tree[x << | ].ans) % phi[];
}
inline ll query(int l, int r, int x, int a, int b)
{
if(l > b || r < a) return ;
if(l >= a && r <= b) return tree[x].ans % phi[];
int mid = (l + r) >> , ret = ;
ret = (ret + query(l, mid, x << , a, b)) % phi[];
ret = (ret + query(mid + , r, x << | , a, b)) % phi[];
return ret;
}
} using namespace seg;
int main()
{
scanf("%d%d%lld%lld", &n, &m, &p, &c);
phi[] = p;
ll P = p;
while(P != ) phi[++cnt] = P = getphi(P);
phi[++cnt] = ;
for(int i = ; i <= n; ++i) scanf("%lld", &table[i]);
build(, n, );
while(m--)
{
int opt, l, r; scanf("%d", &opt);
if(opt == )
{
scanf("%d%d", &l, &r);
update(, n, , l, r);
}
if(opt == )
{
scanf("%d%d", &l, &r);
printf("%lld\n", query(, n, , l, r));
}
}
return ;
}

bzoj4869的更多相关文章

  1. 【BZOJ4869】相逢是问候(线段树,欧拉定理)

    [BZOJ4869]相逢是问候(线段树,欧拉定理) 题面 BZOJ 题解 根据欧拉定理递归计算(类似上帝与集合的正确用法) 所以我们可以用线段树维护区间最少的被更新的多少次 如果超过了\(\varph ...

  2. BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)

    由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...

  3. BZOJ4869 [Shoi2017]相逢是问候 【扩展欧拉定理 + 线段树】

    题目链接 BZOJ4869 题解 这题调得我怀疑人生,,结果就是因为某些地方\(sb\)地忘了取模 前置题目:BZOJ3884 扩展欧拉定理: \[c^a \equiv c^{a \mod \varp ...

  4. Bzoj4869: [Shoi2017]相逢是问候

    题面 传送门 Sol 摆定理 \[ a^b\equiv \begin{cases} a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)=1\\ a^b~~~~~~~~~~~~~~~~~ ...

  5. bzoj千题计划271:bzoj4869: [六省联考2017]相逢是问候

    http://www.lydsy.com/JudgeOnline/problem.php?id=4869 欧拉降幂+线段树,每个数最多降log次,模数就会降为1 #include<cmath&g ...

  6. bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)

    这题是六省联考的...据说数据还出了点锅,心疼六省选手QAQ 首先要知道扩展欧拉定理... 可以发现每次区间操作都会使模数进行一次phi操作,而一个数最多取logp次phi就会变成1,这时后面的指数就 ...

  7. 【BZOJ4869】【SHOI2017】相逢是问候

    Description BZOJ传送门 Solution 这题涉及到指数嵌套堆叠,可能可以用欧拉函数解决. 试想一个数\(a_i\)经过\(k\)次操作后会变成什么? \[ k个c\;\; \begi ...

  8. 【bzoj4869】相逢是问候

    Portal-->bzoj4869 Solution 这道题的话..长得就是线段树的样子qwq 如果做过的话..可能会联想到bzoj3211(没写博qwq晚点再说吧哈哈..) 首先大胆猜一波结论 ...

  9. [BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)

    4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1313  Solved: 471[Submit][Stat ...

  10. BZOJ4869:[SHOI2017]相逢是问候——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4869 题面复制于洛谷:https://www.luogu.org/problemnew/show/P ...

随机推荐

  1. Python Pandas库的学习(一)

    今天我们来学习一下Pandas库,前面我们讲了Numpy库的学习 接下来我们学习一下比较重要的库Pandas库,这个库比Numpy库还重要 Pandas库是在Numpy库上进行了封装,相当于高级Num ...

  2. Spider-Python爬虫之聚焦爬虫与通用爬虫的区别

    为什么要学习爬虫? 学习爬虫,可以私人订制一个搜索引擎. 大数据时代,要进行数据分析,首先要有数据源. 对于很多SEO从业者来说,从而可以更好地进行搜索引擎优化. 什么是网络爬虫? 模拟客户端发送网络 ...

  3. jquery 点击弹框

    <a href="#" class="big-link" data-reveal-id="myModal" data-animatio ...

  4. 下载Spring4.1.x源码并用IntelliJ IDEA打开-----

    下载Spring4.1.x源码并用IntelliJ IDEA打开-------https://blog.csdn.net/boling_cavalry/article/details/79426075 ...

  5. HDU 3749 Financial Crisis(点-双连通分量)

    Because of the financial crisis, a large number of enterprises go bankrupt. In addition to this, oth ...

  6. 游走(bzoj 3143)

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...

  7. fastcgi与cgi的区别[转载]

    cgi 在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,如果碰到一个动态请求怎么办呢?web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序 (或per ...

  8. iOS点击cell时,控件背景色消失的解决方法

    同时调用一下两个方法: - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected ...

  9. [bzoj1692][Usaco2007 Dec]队列变换_后缀数组_贪心

    队列变换 bzoj-1692 Usaco-2007 Dec 题目大意:给定一个长度为$n$的字符串.每次从头或尾取出一个字符加到另一个字符串里.要求变换后生成的字符串字典序最小,求字典序最小的字符串. ...

  10. swift container server 莫名stuck

    openstack swift container server的进程经常莫名其妙进入 D Ds等状态 记录一下这个时候 storage.error的log 便于分析 一种情形是下面这种log Jun ...