NEFU算法小课堂之数论(一)

一、同余

NEFU算法小课堂之数论(一)_第1张图片

 例题

NEFU算法小课堂之数论(一)_第2张图片

NEFU算法小课堂之数论(一)_第3张图片

#include 

using namespace std;

typedef long long LL;

int main()
{
    LL n,f1=1,f2=1,f3=1,i=0;
    scanf("%lld",&n);
    if(n>2){
        for(i=3;i<=n;i++){
            f3 = (f2+f1)%10007;
            f1 = f2;
            f2 = f3;
        }
    }
    printf("%lld\n",f3);
    return 0;
}



二、gcd与lcm

gcd(最大公因数)

也称欧几里得算法

long long int gcd(long long int a,long long int b)
{
    return b?gcd(b,a%b):a;//相当于 b!=0执行;前 b==0执行:后 //欧几里得算法 递归
}

lcm(最小公倍数)

long long int lcm(long long int a,long long int b)
{
    return (a/gcd(a,b))*b;//揭示了gcd lcm与两数的关系
}

例题一

给出2个数a,b的 Gcd(最大公约数n) 和 Lcm(最小公倍数m) ,求所有符合条件的a,b中,a + b的最小值。

NEFU算法小课堂之数论(一)_第4张图片

思路

gcd(a,b)=n,lcm(a,b)=m

a=np,b=nq(p,q互质)a=np,b=nq(p,q互质)

l c m ( a , b ) = n p q = m

a + b = n ( p + q ) 转 为 求 p + q 最 小 值 

即 一 直 p q = m / n , p 和 q 互 质 , 求 p + q 最 小 值 

代码

#include

#define MAX  0x3f3f3f3f

using namespace std;

typedef long long LL;

int T;
LL gcd(LL a,LL b)
{
	return b?gcd(b,a%b):a;
}
void Solve()
{

	int n,m;
	cin>>n>>m;
	int c = m / n;
	int ans = MAX;
	for(int i=1;i<=c/i;i++)
		if(c%i==0&&gcd(i,c/i)==1)
			ans=min(ans,i+c/i);
	cout<

 例题二

NEFU算法小课堂之数论(一)_第5张图片

#include 

using namespace std;

typedef long long LL;

LL gcd(LL a,LL b)
{
    return b?gcd(b,a%b):a;
}

LL lcm(LL a,LL b)
{
    return (a/gcd(a,b))*b;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int l=0; l

你可能感兴趣的:(算法,c++,开发语言)