同余式,乘法逆元,费马小定理

2024-06-12 09:52

本文主要是介绍同余式,乘法逆元,费马小定理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

同余式

余式是 数论 的基本概念之一,设m是给定的一个正整数,a、b是整数,若满足m| (a-b),则称a与b对模m 同余 ,记为a≡b (mod m),或记为a≡b (m)。 这个式子称为模m的同余式,若m∤ (a-b),则称a、b对模m不同余

同余概念又常表达为: 1.a=b+km (k∈Z); 2.a和b被m除时有相同的 余数 

乘法逆元

乘法逆元的定义:在数学领域,对于群G中的任意一个元素a,总存在G中的一个唯一元素a',使得a×a'=a'×a=e,其中e是群G的单位元。这个元素a'被称为a的乘法逆元。在模运算中,如果ab≡1(mod m),那么b就被称为a关于模m的乘法逆元

费马小定理

推导

由费马小定理+乘法逆元可知,a^(mod-2)就是a取模mod的乘法逆元 

例题

 

题意:就是说给你一个数,然后问你这个数n这个数被连接n次,然后取模 998244353,所得到的结果是什么,例如样例这个5,5被连接五次就是55555,取模998244353还是55555,所以要输55555

思路,我们发现在连接的过程中,每一项都是后一项的w倍(w是给出的n的倍数,有一位,w就要乘上10,比如说上面这个样例的w就是10)

最终结果是sum=n+w^1*n+w^2*n+......+w^n-1*n;

我们发现每一项都是等比数列,我们可以用等比数列的公式计算出最终结果为n*(w^n-1)/w-1

由取模公式可知,除法取模不能直接取模,我们要借助费马小定理进行逆元,然后得到的

w-1的乘法逆元为(w-1)^(mod-2)

最终结果就变成了n*(w^n-1)*(w-1)^(mod-2),然后在计算过程中对每一步都进行取余数就OK了

当然了,计算这种指数也有方法,用快速幂算法logN的数据绝对不会爆

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int w=1;//统计位数
int mod=998244353; 
int sum=0;
//快速幂公式
int fast(int a, int b) 
{long long result = 1;long long base = a;while (b > 0) {if (b % 2 == 1) {result = (result * base) % mod;}base = (base * base) % mod;b /= 2;}return result;
}signed main()
{cin>>n;int flag=n;while(flag){flag/=10;w*=10;w%=mod;}sum=((n%mod*(fast(w,n)-1)%mod)%mod*fast(w-1,mod-2)%mod)%mod;cout<<sum;return 0;
}

这篇关于同余式,乘法逆元,费马小定理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

hdu4828(卡特兰数+逆元)

这题的前几个数据分别为1,2,5,14,32......................然后确定这是个卡特兰数列 下面来介绍下卡特兰数,它的递推式为f[i+1] = f[i]*(4*n - 6)/n,其中f[2] = f[3] =1;f[4] = 2;f[5] = 14;f[6] = 32.................................. 但是这题的n太大了,所以要用到逆元,

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,

CPC23三 K.(Lucas定理)

K.喵喵的神·数 Time Limit: 1 Sec Memory Limit: 128 MB Description 喵喵对组合数比较感兴趣,并且对计算组合数非常在行。同时为了追求有后宫的素质的生活,喵喵每天都要研究质数。 我们先来复习一下什么叫做组合数。对于正整数P、T 然后我们再来复习一下什么叫质数。质数就是素数,如果说正整数N的约数只有1和它本身,N

高精度加法,乘法,阶乘

#include <iostream>#include <map>#include <string>#include <algorithm>using namespace std;const int Max = 50000;string str1,str2;/***********乘法***********/void chenfa(){cin >> str1>>str2;int a

每日一题~cf 970 div3 (A思维,B小模拟,C二分,D排列数建图成环,E 26个字母暴力+前缀和,F 逆元,G 数论gcd )

A 题意: 有 a 个1 ,b 个2.问是否能将这些数划分为两个数值相等的集合。 输出 YES 或者 NO —————— 问题等价于 将数组 分成两个数值相同的数组。所以sum 应该是偶数。也就是说 1 的个数是偶数。在i1的个数是偶数的情况下,将 2 分成两份,如果2 的个数是偶数,OK。如果是奇数那么需要1来补齐,如果1 的个数大于等于2那么可以补齐。(1 的个数是偶数,需要2个1来补齐,剩下

乘法问题c++

题目描述 小 A 最近刚刚学习了乘法,为了帮助他练习,我们给他若干个正整数,并要求他将这些数乘起来。 对于大部分题目,小 A 可以精准地算出答案,不过,如果这些数的乘积超过 ,小 A 就不会做了。 请你写一个程序,告诉我们小 A 会如何作答。 输入 第一行一个整数 n,表示正整数的个数。 接下来 n行,每行一个整数a 。小 A 需要将所有的 a乘起来。 保证n<=50,a<=100. 输出

量化交易面试:什么是中心极限定理?

中心极限定理(Central Limit Theorem, CLT)是概率论和统计学中的一个重要定理,它描述了在一定条件下,独立随机变量的和的分布趋向于正态分布的性质。这个定理在量化交易和金融分析中具有重要的应用价值。以下是对中心极限定理的详细解释: 基本概念: 中心极限定理指出,当我们从一个具有任意分布的总体中抽取足够大的样本时,样本均值的分布将近似于正态分布,无论原始总体的分布是什么样的。