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. 一个关于vue+mysql+express的全栈项目(一)

    最近学了mysql数据库,寻思着能不能构思一个小的全栈项目,思来想去,于是就有了下面的项目: 先上几张效果图吧       目前暂时前端只有这几个页面,后端开发方面,有登录,注册,完善用户信息,获取用 ...

  2. 百度地图离线API 2.0(含示例,可完全断网访问)

    由于公司需求,自己修改的离线地图API.该压缩包具有如下功能:1.支持使用google地图瓦片(不建议使用,效率不高,缩放级别较高时拖动有些卡顿,建议注释该代码块:overlayTileLayer.g ...

  3. api安全认证

    三.auth自定义授权 客户端代码: import requests import hashlib import time current_time = time.time() #自意义的字符串app ...

  4. codeforces 362A找规律

    刚开始以为是搜索白忙活了原来是个简单的找规律,以后要多想啊 此题是两马同时跳 A. Two Semiknights Meet time limit per test 1 second memory l ...

  5. Django开发:(3.1)ORM:单表操作

    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...

  6. Eclipse配置SVN的几种方法及使用详情

    此文章对Myeclipse同样适用. 一.在Eclipse里下载Subclipse插件 方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help ...

  7. PatentTips - Hierarchical RAID system including multiple RAIDs

    BACKGROUND OF THE INVENTION The present invention relates to a storage system offering large capacit ...

  8. nyoj_758_分苹果

    分苹果 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法? (注意:假如有3个盘子7 ...

  9. Java中如何获取spring中配置的properties文件内容

    有2种方式: 一. 1.通过spring配置properties文件 [java]  <bean id="propertyConfigurer"      class=&qu ...

  10. 将github上的项目源码导入eclipse详细教程

    将github上的项目源码导入eclipse详细教程 学习了: http://blog.csdn.net/itbiggod/article/details/78462720