我是靠谱客的博主 彩色汉堡,最近开发中收集的这篇文章主要介绍【Ybt OJ】[数学基础 第3章] 同余问题分析:分析:分析:分析:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

「 「 数学基础 」 」 3 3 3章 同余问题
目录:

A.同余方程
B.约数之和
C.线性求逆元
D.中国剩余定理

A . A. A. 例题 1 1 1 同余方程

在这里插入图片描述
洛谷 l i n k link link

分析:

拓展欧几里得 ( e x g c d ) (exgcd) (exgcd) 板子
由于要求最小正整数解 最后要对答案进行处理

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
ll a,b,x,y;
void exgcd(ll a,ll b)
{
	if(b==0)
	{
		x=1;
		y=0;
		return;
	}
	exgcd(b,a%b);
	ll k=x;
	x=y;
	y=k-a/b*y;
}
int main()
{
	scanf("%lld%lld",&a,&b);
	exgcd(a,b);
	printf("%lld",(x%b+b)%b);
	
	return 0;
	
} 

B . B. B. 例题 2 2 2 约数之和

在这里插入图片描述

分析:

唯一分解定理:
A = p 1 k 1 × p 2 k 2 × . . . × p n k n A=p_1^{k_1}times p_2^{k_2}times...times p_n^{k_n} A=p1k1×p2k2×...×pnkn
那么 A B = p 1 k 1 × B × p 2 k 2 × B × . . . × p n k n × B A^B=p_1^{k_1times B}times p_2^{k_2times B}times...times p_n^{k_ntimes B} AB=p1k1×B×p2k2×B×...×pnkn×B
A B A^B AB的约数和为 ∏ i = 1 n ( ∑ j = 0 B × k i p i j ) ∏_{i=1}^n(sum_{j=0}^{Btimes k_i}p_i^j) i=1n(j=0B×kipij)
然后等比数列求和 ∏ i = 1 n ( p i B × k i + 1 − 1 p i − 1 ) ∏_{i=1}^n(frac{p_i^{Btimes k_i+1}-1}{p_i-1}) i=1n(pi1piB×ki+11)
分子可以用快速幂求出 分母看是否与 9901 9901 9901互质 不互质就是 p i − 1 p_i-1 pi1的乘法逆元
如果互质 则 p i p_i pi m o d mod mod 9901 = 1 9901=1 9901=1 该项变为 i ∑ j = 0 k j × B = k i × B + 1 i^{sum_{j=0}^{k_jtimes B}}=k_itimes B+1 ij=0kj×B=ki×B+1 m o d mod mod 9901 9901 9901

CODE:

#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int Mod=9901;
ll prime[105],c[105],ans=1ll,A,B,tot; 
void Div(int x)  //分解质因子
{
	for(int i=2;i*i<=x;i++)
	{
		if(x%i==0) prime[++tot]=i;
		while(x%i==0)
		{
			c[tot]++;
			x/=i;
		} 
	}
	if(x>1) 
	{
		prime[++tot]=x;
		c[tot]=1;	
	}
}
ll ksm(ll a,ll k)
{
	ll res=1;
	while(k)
	{
		if(k&1) (res*=a)%=Mod;
		k>>=1;
		(a*=a)%=Mod;
	}
	return res;
}
int main()
{
	scanf("%lld%lld",&A,&B);
	Div(A);
	for(int i=1;i<=tot;i++)
	{
		if((prime[i]-1)%Mod==0)
		{
			ans=ans*(B*c[i]+1)%Mod;
			continue;
		}
		int tmp=ksm(prime[i],B*c[i]+1);
		tmp=(tmp-1+Mod)%Mod;
		int inv=prime[i]-1;  
		inv=ksm(inv,Mod-2);  //逆元
		ans=ans%Mod*inv*tmp%Mod;
	}
	printf("%lld",ans);
	
	return 0;
}

C . C. C. 例题 3 3 3 线性求逆元

在这里插入图片描述
洛谷 l i n k link link

分析:

逆元线性递推公式 模板

CODE:

#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=3e6+5;
int n,p,inv[N];
int main()
{
	scanf("%d%d",&n,&p);
	inv[1]=1;
	for(int i=2;i<=n;i++)
		inv[i]=(ll)(p-p/i)*inv[p%i]%p;
	for(int i=1;i<=n;i++)
		printf("%dn",inv[i]);	
	
	return 0;
}

D . D. D. 例题 4 4 4 中国剩余定理

在这里插入图片描述
在这里插入图片描述
洛谷 l i n k link link

分析:

e x g c d + C R T exgcd+CRT exgcd+CRT 板子
注意处理负数的

CODE:

#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll n,a[16],b[16],Mod=1,ans;
void exgcd(ll a,ll b,ll &x,ll &y)
{
	if(!b){
		x=1;
		y=0;
		return;
	}
	exgcd(b,a%b,x,y);
	int k=x;
	x=y;
	y=k-a/b*y;
}
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld",&a[i],&b[i]);
		Mod*=a[i];
	}
	for(int i=1;i<=n;i++)  //求方程组数
	{
		ll x=0,y=0;
		exgcd(Mod/a[i],a[i],x,y);
		(ans+=b[i]*Mod/a[i]%Mod*(x<0?x+a[i]:x))%=Mod;
	}
	printf("%lld",ans%Mod);
	
	return 0;
}

最后

以上就是彩色汉堡为你收集整理的【Ybt OJ】[数学基础 第3章] 同余问题分析:分析:分析:分析:的全部内容,希望文章能够帮你解决【Ybt OJ】[数学基础 第3章] 同余问题分析:分析:分析:分析:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部