noip模拟赛 Nephren Ruq Insania
题目背景
大样例下发链接: https://pan.baidu.com/s/1nuVpRS1 密码: sfxg
注意:本题大样例4的输出文件修改为 https://pan.baidu.com/s/1bUWuZW
奈芙莲·卢可·印萨尼亚(Nephren-Ruq-Insania)
同为妖精仓库的成体妖精兵,天赋不如珂朵莉一般,只是一个平凡的妖精.
睡觉时如同毯子一般在威廉身上为其保暖。习惯于粘着威廉,在梦境中与艾尔梅莉亚交谈时,自称就像是威廉的宠物一样。
本题题面中含有大量的剧透,建议做题之前将这部番剧看完(
题目描述
她只是一个非常普通的黄金妖精。
在援救打捞队的作战中,他们不幸与(几乎是所有的)第六兽相遇了。
此时的珂朵莉因为接触到星神艾露可本体,正处于昏迷之中。而威廉也无法离开珂朵莉。
默默守护在房间外的她,提起圣剑,走向了战场。
作为本身天赋只是一般的妖精少女,她难以对抗无数倍于自己的六号兽。
没有多久,她开始体力不支。
终于,在源源不断的六号兽面前,她难以抵挡了……
终于,由于魔力过度激发,她已经处在了魔力失控的边缘……
”威廉,拯救,是我们黄金妖精的使命。“
”况且,威廉之前已经救过我们了。“
”所以,已经没有问题了。“
威廉想要救下奈芙莲,但是他自己也已经处于崩溃的边缘。
冥冥之中他想起了曾经学习过的一种魔法。在这最后一刻,或许已经是唯一的办法了。
这种魔法操作的对象是一个咒语组成的序列,每一个单独的咒语拥有自己的法力值。
威廉需要不断地按照之前的记忆,对某一段区间的法力值加上一个数,或者求出某一段区间的法咒共鸣。
分析:这道题部分分还是比较多的.第一个数据点看起来数据非常小,但是3^3^3^3^3mod p会算不出来,因为次数很大,不能直接对次数取模.怎么将次数变小呢?欧拉定理! ,可以发现如果这道题就是不断地使用欧拉定理,直到φ(p)变成1或者计算完整个区间,这实际上就是一个递归的过程.用线段树进行区间修改,单点查询。
有几个地方需要注意:
1.如果区间[l,r]中第x位是1,那么[x,r]都不需要考虑了,因为1^n = 1.
2.欧拉定理成立的条件是x >= φ(p),而由于忽略0和1的情况,2^2^2^2^2就足以满足数据范围了,所以暴力枚举5位乘起来看看是不是>=φ(p)就可以了.如果<φ(p)就可以直接算,而不需要欧拉定理了.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int maxn = ; int n, m, prime[], phi[], cnt, flag[maxn];
long long tag[maxn << ], c[maxn << ], a[maxn], L[maxn << ], R[maxn << ];
bool vis[]; void init()
{
phi[] = ;
for (int i = ; i <= ; i++)
{
if (!vis[i])
{
prime[++cnt] = i;
phi[i] = i - ;
}
for (int j = ; j <= cnt; j++)
{
int t = i * prime[j];
if (t > )
break;
vis[t] = ;
if (i % prime[j] == )
{
phi[t] = phi[i] * prime[j];
break;
}
phi[t] = phi[i] * (prime[j] - );
}
}
} void pushup(int o)
{
c[o] = c[o * ] + c[o * + ];
} void pushdown(int o)
{
if (tag[o])
{
tag[o * ] += tag[o];
tag[o * + ] += tag[o];
c[o * ] += (R[o * ] - L[o * ] + ) * tag[o];
c[o * + ] += (R[o * + ] - L[o * + ] + ) * tag[o];
}
tag[o] = ;
} void build(int o, int l, int r)
{
L[o] = l;
R[o] = r;
if (l == r)
{
c[o] = a[l];
return;
}
int mid = (l + r) >> ;
build(o * , l, mid);
build(o * + , mid + , r);
pushup(o);
} void update(int o, int l, int r, int x, int y, int v)
{
if (x <= l && r <= y)
{
tag[o] += v;
c[o] += v;
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update(o * , l, mid, x, y, v);
if (y > mid)
update(o * + , mid + , r, x, y, v);
pushup(o);
} long long query(int o, int l, int r, int pos)
{
if (l == r)
return c[o];
pushdown(o);
int mid = (l + r) >> ;
if (pos <= mid)
return query(o * , l, mid, pos);
else
return query(o * + , mid + , r, pos);
} long long Cal(int q)
{
if (flag[q] == m)
return a[q];
flag[q] = m;
return a[q] = query(, , n, q);
} long long qpow(long long a, long long b, long long mod)
{
a %= mod;
long long res = ;
while (b)
{
if (b & )
res = (res * a) % mod;
a = (a * a) % mod;
b >>= ;
}
return res;
} long long jisuan(int l, int r, int mod)
{
if (mod == )
return ;
if (l == r)
{
long long t = Cal(l);
if (t < mod) //直接算
return t % mod;
else
return (t % mod) + mod;
}
int minn = min(n, l + );
for (int i = l + ; i <= minn; i++)
if (Cal(i) == )
{
minn = i;
break;
}
long long p = Cal(minn), tot = ;
for (int i = minn - ; i >= l + ; i--)
{
tot = p;
p = ;
while (tot--)
{
p *= Cal(i);
if (p >= phi[mod])
return qpow(Cal(l) % mod, jisuan(l + , r, phi[mod]) + phi[mod], mod);
}
}
return qpow(Cal(l) % mod, jisuan(l + , r, phi[mod]), mod);
} int main()
{
memset(flag, -, sizeof(flag));
init();
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%lld", &a[i]);
build(, , n);
while (m--)
{
int op, l, r, mod;
scanf("%d%d%d%d", &op, &l, &r, &mod);
if (op == )
update(, , n, l, r, mod);
else
printf("%lld\n", jisuan(l, r, mod) % mod);
} return ;
}
noip模拟赛 Nephren Ruq Insania的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- magento 自建插件通道服务
首先建立如下的目录结构 在channel.xml中如此写上 <channel> <name>local</name> <uri>http://local ...
- 16-6 WEB存储-通讯录实战
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 为什么JAVA虚拟机分为线程共享和非线程共享?
大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟 ...
- 227 Basic Calculator II 基本计算器II
实现一个基本的计算器来计算一个简单的字符串表达式. 字符串表达式仅包含非负整数,+, - ,*,/四种运算符和空格 . 整数除法仅保留整数部分. 你可以假定所给定的表达式总是有效的. 一些例子: &q ...
- Anaconda(miniconda)安装及使用--转
https://www.waitalone.cn/anaconda-install-error.html 3,224 1.Anaconda概述 Anaconda是一个用于科学计算的 ...
- Unity笔记(4)自学第四、五天
主要是移动脚本和2个技能的脚本编写. 首先是移动的脚本: using System.Collections; using System.Collections.Generic; using Unity ...
- [安卓开发板]迅为IMX6 四核Android开发板
工业级核心板-Android开发板 10层高速PCB设计,充分保证电磁兼容 处理器:开发板默认是四核商业扩展级芯片,可根据用户需求更换单核.双核.工业级.汽车级处理器,批量更省成本. 扩展引脚:320 ...
- 5-Java-C(调和级数)
题目描述: 1/1 + 1/2 + 1/3 + 1/4 + ... 在数学上称为调和级数. 它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字. 但是,它发散的很慢: 前1项和达到 1. ...
- windows 下安装 RabbitMQ
一.安装 RabbitMQ 前需要先安装 Erlang http://www.erlang.org/downloads 下下载对应版本的安装文件进行安装. 安装完成后配置环境变量: ERLANG_HO ...
- Android突破64K限制
1.添加依赖 android{ defaultConfig{ ... multiDexEnabled true ... } } dependencies{ compile 'com.android.s ...