Super A^B mod C FZU - 1759 (数论)

2023-10-22 18:10
文章标签 mod 数论 super fzu 1759

本文主要是介绍Super A^B mod C FZU - 1759 (数论),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://vjudge.net/problem/FZU-1759

昨天打焦作赛G题没做出来,朋友告诉我要用欧拉降幂,发现用欧拉降幂->快速幂取模->同余模定理...一系列数论基础知识我都不太会,今天就来补补课,发现数论真的好神奇~

首先需要知道一个定理:同余模定理。

同余模定理:积和差的取余等于取余的积和差的取余,即:

                (a+b)%c = ((a%c)+(b%c))%c

                (a-b)%c = ((a%c)-(b%c))%c

                (a*b)%c = ((a%c)*(b%c))%c

通过同余模定理可以退出快速幂取模的算法,一些范围不太大的取模这样也就够了,可像此题中10e100000这么大的范围是需要另外一个知识的:欧拉降幂。

说到欧拉降幂就必须要提到欧拉函数,欧拉函数是小于或等于n的正整数中与n互质的数的数目(如φ(1)=1),算法模板在下面

但对于此题中1e100000这么大的范围,降一次幂肯定是不够的,这就又用到了同余模定理中的(a+b)%c = ((a%c)+(b%c))%c

把B作为char数组储存下来,然后根据位数来拆分,10e100000的复杂度就变成100000复杂度了~一秒过没问题

数论真的是太神奇了!

//Super A^B mod C
#include<cstdio>
#include<cstring>
using namespace std;typedef long long LL;
const LL maxn = 1000050;
LL A, C;
char B[maxn];
LL pow_mod(LL a,LL b,LL mod)
{  //快速幂取模模板LL s=1;while(b){if(b&1) s=(s*a)%mod;a=(a*a)%mod;b=b>>1;}return s;
}
LL get_phi(LL x)
{  //欧拉函数模板LL i,ans=x;for(i=2;i*i<=x;i++) if(x%i==0){ans-=ans/i;while(x%i==0) x/=i;}if(x>1) ans-=ans/x;return ans;
}int main()
{while(scanf("%lld %s%lld",&A,B,&C) != EOF){LL len = strlen(B)-1, phi = get_phi(C), tmp = 0;for(int i = 0; i <= len; i++){tmp = ((B[i]-'0')+(tmp*10)); //同余模定理if(tmp > C) break;}if(tmp <= C) printf("%lld\n",pow_mod(A,tmp,C)); //当B小于C直接快速幂else{tmp = 0;for(int i = 0; i <= len; i++) //当B大于等于C时欧拉降幂tmp = ((B[i]-'0')+(tmp*10)) % phi;printf("%lld\n",pow_mod(A, tmp+phi, C));}memset(B,0,sizeof(B));}return 0;
}

 

这篇关于Super A^B mod C FZU - 1759 (数论)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262873

相关文章

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

POJ2247数论

p = 2^a*3^b*5^c*7^d 求形如上式的第n小的数。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.u

fzu 2277 Change 线段树

Problem 2277 Change Time Limit: 2000 mSec    Memory Limit : 262144 KB  Problem Description There is a rooted tree with n nodes, number from 1-n. Root’s number is 1.Each node has a value ai.

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

问:Super与this在Java中有什么区别?

this: this 关键字用于引用当前对象。它通常用于区分成员变量和方法参数或局部变量。在实例方法中,this 指向调用该方法的对象。在构造函数中,this 指向正在被初始化的对象。 super: super 关键字用于引用父类(超类)的构造函数、方法或变量。在子类的构造函数中,super() 用于调用父类的构造函数。在子类的方法中,super.methodName() 用于调用父类的方法。

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

MTK Android P/Q system/vendor/super快速打包

一、Android 新版本默认开启了动态分区,把system vendor  product等分区打包成一个super分区。这对于我们使用替换分区的方法来排查问题不是很方便,直接替换一个super也不知道到底是哪个部分导致的。所以我们需要自己制作super.img来缩小范围。下面讲讲如何快速生成system、vendor、super,以及vbmeta(校验image,不匹配可能会导致不开机) 二