【NC23050】华华对月月的忠诚

题目

华华对月月的忠诚

最大公约数

思路

题目看起来很吓人,但往往题目越是吓人,就说明题的技巧很强。

题目要求 g c d ( F n + 1 , F n ) gcd(F_{n+1},F_n) gcd(Fn+1,Fn),并且已经知道的是: F 1 = A , F 2 = B , F i = F i − 1 + F i − 2 ( i > 2 ) F_1=A,F_2=B,F_i=F_{i−1}+F_{i−2}(i>2) F1=A,F2=B,Fi=Fi1+Fi2(i>2)

不妨设 g = g c d ( F n + 1 , F n ) g = gcd(F_{n+1},F_n) g=gcd(Fn+1,Fn) F n + 1 = x × g , F n = y × g F_{n+1}=x\times g,F_n=y\times g Fn+1=x×g,Fn=y×g,显然 x > y x>y x>y,则有 F n + 1 − F n = ( x − y ) × g = F n − 1 F_{n+1}-F_n=(x-y)\times g = F_{n-1} Fn+1Fn=(xy)×g=Fn1,可以知道的是, F n − 1 = ( x − y ) × g F_{n-1}=(x-y)\times g Fn1=(xy)×g 也是 g g g 的倍数,也就是说 g = g c d ( F n + 1 , F n ) = g c d ( F n , F n − 1 ) g = gcd(F_{n+1},F_n)=gcd(F_n,F_{n-1}) g=gcd(Fn+1,Fn)=gcd(Fn,Fn1)

以此类推,可以得到以下结论:

g = g c d ( F n + 1 , F n ) = g c d ( B , A ) g = gcd(F_{n+1},F_n)=gcd(B,A) g=gcd(Fn+1,Fn)=gcd(B,A)

所以直接求 A , B A,B A,B 的最大公约数即可。

代码

#include <iostream>
using namespace std;
using ULL = unsigned long long;

ULL gcd(ULL a, ULL b) {
    ULL t = 0;
    while (b) {
        t = a % b;
        a = b;
        b = t;
    }
    return a;
}

int main(void) {
    ULL a = 0, b = 0;
    // 忽略 N,因为没用,也没必要开一个字符串去存
    cin >> a >> b;
    cout << gcd(a, b) << endl;
    return 0;
}
  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木又可可

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值