FZU 1759-Super A^B mod C(快速幂+大整数取模+欧拉函数)

题目链接:点击打开链接

题意:计算 a^b %c 但其中b很大,可能会达到10^1000000, 故有降幂公式 a^b %c= a^(b%phi(c)+phi(c)) %c  (b>=phi(c))

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <string>
#include <cctype>
#include <vector>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define maxn 10100
#define _ll __int64
#define ll long long
#define INF 0x3f3f3f3f
#define Mod 1000000007
#define pp pair<int,int>
#define ull unsigned long long
using namespace std;
int a,c;char b[1000010];
ll phi(ll n)
{
	ll m=(ll)sqrt(n+0.5),ans=n;
	for(ll i=2;i<=m;i++)
	{
		if(n%i==0)
		{
			ans=ans/i*(i-1);
			while(n%i==0)n/=i;
		}
	}
	if(n>1)ans=ans/n*(n-1);
	return ans;
}
ll pow_mod(ll a,ll n,ll p)
{
	if(n==0)return 1;
	ll ans=pow_mod(a,n/2,p);
	ans=ans*ans%p;
	if(n&1)ans=ans*a%p;
	return ans;
}
void solve()
{
	int len=strlen(b);ll tem=phi(c),sb;
	if(len<=10)
	{
		sscanf(b,"%I64d",&sb);
		if(sb>=tem)
			printf("%I64d\n",pow_mod(a,sb%tem+tem,c));
		else
			printf("%I64d\n",pow_mod(a,sb,c));
		return ;
	}
	ll ans=0;
	for(int i=0;i<len;i++)
		ans=(ans*10+(b[i]-'0'))%tem;
	printf("%I64d\n",pow_mod(a,ans+tem,c));
}
int main()
{
	while(~scanf("%I64d %s %I64d",&a,b,&c))
		solve();
    return 0;
}
时间: 2024-10-20 01:27:57

FZU 1759-Super A^B mod C(快速幂+大整数取模+欧拉函数)的相关文章

快速幂 生成素数表 生成Euler欧拉函数值表

快速幂: int pow_mod(LL a,LL b) { int num=1; while(b) { if(b&1) num=(num*a)%MOD; a=(a*a)%MOD; b>>=1; } return num; } 生成素数表: bool flag[maxn]={0}; void Prime(int x) { for(int i=2;i<=x;i++) { if(flag[i]) continue; prime[cnt++]=i; for(int j=2;i*j<

HDOJ M斐波那契数列 4549【矩阵快速幂+快速幂+费马小定理+欧拉函数】

M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2096    Accepted Submission(s): 596 Problem Description M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = a F[1] = b F[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给

FZU - 1759 Super A^B mod C 降幂公式

知道降幂公式这题就很好办了 B>=Phi(c)的时候可以降幂然后快速幂计算,否则就直接快速幂计算. 这里的大数对小数取模直接利用取模性质按位取就行了. //A^B %C=A^( B%phi(C)+phi(C) ) %C #include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include<string> #include<cmath&g

Super A^B mod C 快速幂+欧拉函数降幂

uper A^B mod C Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are

Sum(快速幂+大整数计算)

题意:给出一个函数s,该函数值为对于n的s(k)为数列的个数,该数列满足x1,x2--xk为正整数且x1+x2+--+xk=n:求解s(1)+s(2)+--+s(n); 分析:本题最坑的地方在于(1,2)与(2,1)算两种,搞明白这个就可以分析l 对于2来说就是 1 3  : 1,1 4  :1,2,1 5  :1,4,2,1 以此类推可知  其和为2^(n-1);但是n的个数特别大,所以不能直接输入,要采用大数计算方法,一定要用快速幂的方式. 快速幂:a^n=(a^2)^(n/2),这样就可以

FZU 1759 欧拉函数 降幂公式

Description Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000). Input There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a singl

XMU 1615 刘备闯三国之三顾茅庐(三) 【欧拉函数+快速幂+欧拉定理】

1615: 刘备闯三国之三顾茅庐(三) Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 45  Solved: 8[Submit][Status][Web Board] Description 刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代.刘备一生极具传奇色彩,早年颠沛流离.备尝艰辛最终却凭借自己的谋略终成一方霸主.那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢

快速幂(整数 + 矩阵)

一.整数m ^ n  % k 的快速幂: ll quickpow(ll m, ll n , ll k){ ll ans = 1; while(n){ if(n & 1)//如果n是奇数 ans = (ans * m) % k; n = n >> 1;//位运算“右移1类似除2” m = (m * m) % k; } return ans; } 二.矩阵 M ^ n % mod 的快速幂: struct Matrix { ll m[MAXN][MAXN]; //二维数组存放矩阵 Matr

HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂

装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1]*f[n-2].然后a和b系数都是呈斐波那契规律增长的.需要先保存下来指数.但是太大了.在这里不能用小费马定理.要用降幂公式取模.(A^x)%C=A^(x%phi(C)+phi(C))%C(x>=phi(C)) Phi[C]表示不大于C的数中与C互质的数的个数,可以用欧拉函数来求. 矩阵快速幂也不