1. 程式人生 > 實用技巧 >HDU 1222 Wolf and Rabbit(數論)

HDU 1222 Wolf and Rabbit(數論)

題目連結

題目大意

  有一座山旁邊為N個山洞連成環形,編號為0,1,2,3,4,...n-1一頭兔子和一隻狼來到了這座山上.為了防止被狼捉到,兔子需要藏進某個洞裡 ,狼第一次進入編號為0的洞口,然後每次只能前進m個洞口,例如m=2,n=6,則狼將進入0,2,4,0,2,4....所以兔子只需躲在編號為1 3 5 的洞裡即可逃生。

解題思路

  當n與m互質的時候,狼肯定能訪問到每個洞,負責不能。
  證明:當n與m互質的時候,如果需要走到0號洞,那麼就必須走lcm(n,m)步,又因為有n個洞,所以必需要走\(n\times m\)步,那麼就需要gcd(n,m)=1才能使\(lcm(n,m)=n\times m\)

。但是還漏了一點,雖然走了n個洞,但是怎麼證明每個洞都不一樣呢?之前說了,lcm(n,m)是最小的迴圈節,如果在這個迴圈節中出現了兩個相同的數,說明這兩個數之間的數再加上兩個中的一個是一個更小的迴圈節,與之前的結論矛盾了,所以說當gcd(n,m)=1的時候走過\(n\times m\)步一共能走過n個不同的洞。

程式碼

const int maxn = 2e3+10;
const int maxm = 1e4+10;
int main() {
    int t; cin >> t;
    while(t--) {
        ll a, b; cin >> a >> b;
        if (__gcd(a,b)==1) cout << "NO" << endl;
        else cout << "YES" << endl;
    }
    return 0;  
}