【CF906D】Power Tower

题目

题目链接:https://codeforces.com/problemset/problem/906/D

给出一个数列 \(a\),每次询问给出 \(l,r\),求

思路

根据扩展欧拉定理,当 \(b\geq \varphi(p)\) 时,

\[a^b\equiv a^{b\bmod \varphi(p)+\varphi(p)}\pmod p
\]

所以我们可以考虑递归求解,类似 这题,直到 \(l>r\) 或 \(p=1\)。

由于 \(\varphi(\varphi(n))...\) 在 \(\log n\) 次就会下降至 1,所以递归求解时间复杂度 \(O(n\log n)\)。

但是这题 \(p\leq 10^9\),线性筛显然不行,考虑到只有 \(O(n\log n)\) 个数要求 \(\varphi\),所以直接每个数暴力求 \(\varphi\),然后套上记忆化优化一下即可。

时间复杂度 \(O(n\sqrt{n}\log n)\)。而且远远跑不满。

代码

#include <map>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;

const int N=100010;
int n,Q,MOD,a[N];
map<int,int> phi;

int Phi(int x)
{
	if (phi[x]) return phi[x];
	int p=x,y=x;
	for (int i=2;i*i<=x;i++)
		if (x%i==0)
		{
			p=p/i*(i-1);
			while (x%i==0) x/=i;
		}
	if (x>1) p=p/x*(x-1);
	return phi[y]=p;
}

ll fpow(ll x,ll k,int mod)
{
	ll ans=1;
	for (;k;k>>=1,x*=x)
	{
		if (x>=mod) x=x%mod+mod;
		if (k&1) ans=ans*x;
		if (ans>=mod) ans=ans%mod+mod;
	}
	return ans;
}

int solve(int x,int y,int p)
{
	if (p==1 || x>y) return 1;
	return (int)fpow(a[x],solve(x+1,y,Phi(p)),p);
}

int main()
{
	scanf("%d%d",&n,&MOD);
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&Q);
	while (Q--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		printf("%d\n",solve(l,r,MOD)%MOD);
	}
	return 0;
}

原文地址:https://www.cnblogs.com/stoorz/p/12604597.html

时间: 2024-09-29 21:42:46

【CF906D】Power Tower的相关文章

【CF913G】Power Substring 数论+原根

[CF913G]Power Substring 题意:T组询问,每次给定一个数a,让你求一个k,满足$2^k$的10进制的后$min(100,length(k))$位包含a作为它的子串.你只需要输出一个k,不需要最小化k的值,保证有解. $T\le 2000,a\le 10^{11}$ 题解:神题. 假设a有n位,$2^k=x$,$x=a\times 10^m+b(\mod 10^{n+m})$,我们显然有$k\ge n+m$,所以$2^{n+m}\mid x$,又因为$2^{n+m}\mid

【POJ2406】【KMP】Power Strings

Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative inte

【BFS】Power Hungry Cows

Power Hungry Cows Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5522   Accepted: 1384 Description FJ's cows would like to be able to compute integer powers P (1 <= P <= 20,000) of numbers very quickly, but need your help. Because they

【LeetCode】Power of Two

问题描写叙述 Given an integer, write a function to determine if it is a power of two. 意:推断一个数是否是2的n次幂 算法思想 假设一个数小于或等于0.一定不是2的幂次数 假设一个大于0且数是2的n次幂,则其的二进制形式有且仅有一个1,反之成立. 算法实现 public class Solution { public boolean isPowerOfTwo(int n) { if(n<=0) return false;

【转】Power System 中基于 VIOS 的虚拟以太网实现

基于 VIOS 的虚拟以太网适配器的工作原理和配置实现 本文对 Power 系统中基于 VIOS 的虚拟以太网适配器(Virtual Ethernet Adapter)的工作原理.基本配置选项和配置步骤进行了讲解,并介绍了两种常用的 High Availability 的配置场景.Power System 的系统工程师可以通过本文了解虚拟以太网适配器的配置方法,软件工程师则可以学习到虚拟以太网适配器的工作原理. PowerVM 中相关概念简介 Power System 通过 PowerVM 软件

【Leetcode】Power of Four

题目链接:https://leetcode.com/problems/power-of-four/ 题目: Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example: Given num = 16, return true. Given num = 5, return false. Follow up: Could you solve it without lo

【HDOJ】Power Stations

DLX.针对每个城市,每个城市可充电的区间构成一个plan.每个决策由N*D个时间及N个精确覆盖构成. 1 /* 3663 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <

【powerBI】power pivot添加参数表

背景 最近在做应用分析,爬了几个应用市场的排行榜,需要分析前多少名各个品类的app有多少个.数据量不大,excel就能做分析,所以想起来pivot的参数表功能.这个功能还是比较实用的,在这再做个记录,以备后来. 思路 首先需要一个参数的字典表,并直接链接回表: 其次,如何判断我在切片器选中了1个参数,这涉及到haveonevalue函数--判断某列是否只有1个值,返回true/false: 最后,怎么把这个选中的值应用到要算的度量里去,这涉及到values函数--取一列中的不重复值. 步骤 1.

【LeetCode】数学(共106题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [2]Add Two Numbers [7]Reverse Integer [8]String to Integer (atoi) [9]Palindrome Number [12]Integer to Roman [13]Roman to Integer [29]Divide Two Integers [43]Multiply Strings [50]Pow(x,