例题
#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(最大公因数)
也称欧几里得算法
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的最小值。
思路
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<
例题二
#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