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数据结构--链表

    class Node(): def __init__(self, dataval=None): self.dataval = dataval self.nextval = None class SLi ...

  2. Android BottomSheet:List列表或Grid网格展示(3)

     Android BottomSheet:List列表或Grid网格展示(3) BottomSheet可以显示多种样式的底部弹出面板风格,比如常见的List列表样式或者Grid网格样式,以一个例子 ...

  3. html的href标签不能下载apk文件

    解决方案: 打开Internet 服务管理器Internet 服务管理器 网站属性 HTTP头(MIME类型) 新建 扩展名:.apk 类型(MIME): application/vnd.androi ...

  4. ORACLE RAC with NFS install

    第一步:建立第一台节点机1).拷贝一台虚拟机做第一个节点,增加host-only的网卡 kudzu工具识别网卡(两都host-only是可以的).然后以下步骤修改相应的配置.etc/hosts内容如下 ...

  5. css3 & background & background-image

    css3 & background & background-image https://developer.mozilla.org/en-US/docs/Web/CSS/backgr ...

  6. android listVIew实现button按钮监听程序

    1.重写simpleAdapter 方法@Override public HashMap<String,String> getItem(int position) { // TODO Au ...

  7. Linux下汇编语言学习笔记6 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  8. codeforces Educational Codeforces Round 39 (Rated for Div. 2) D

    D. Timetable time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  9. POJ 2240_Arbitrage

    题意: 给定一系列货币汇率,求能否从一种货币,经过一系列转换,最终转化回更高价值的该种货币. 分析: 即为求最长路并判断是否存在"正"权值回路,这里用的bellmanford算法. ...

  10. IE插件

    在OA上要直接查看word等公告文件,就必须安装office控件.要安装office控件,需要在IE浏览器中做相应的设置.如何设置呢,下面由小编具体介绍下. 工具/原料   OA IE浏览器 方法/步 ...