SDNU_ACM_ICPC_2021_Winter_Practice_4th [個人賽]

小花&&小豬發表於2021-01-28

傳送門

D - Odd Divisor

題意:

給你一個n,問你n是否至少有一個奇數因子(這裡題意沒說清,沒說是不是隻有一個還是可以有多個!AC以後才發現是不止一個

思路:

如果這個數沒有奇數因子,那它肯定是2^k

1.所以我就開始用迴圈除2,看看最後是不是奇數,1除外,因為2的k次方除到最後就剩下1,所以得特判。但是這個做法感覺還是不夠妙

再兩個妙的做法:

2.因為2^k是指數函式,而與指數函式互為反函式的對數函式,所以我們可以用對數函式來判斷是不是2的k次方

if((int)log2(n) == log2(n))
    cout<<"NO\n";
else
    cout<<"YES\n";

3.因為是2的k次方,所以對於他的二進位制來說,除了首位是1,其他位應該是0,所以可以利用n&(n - 1)來判斷。如果是2的冪次,那麼n-1的二進位制應該是全是1,這與n是剛好相反的,所以取並,得到的肯定是0.

if(n & (n - 1))
    cout<<"YES\n";
else
    cout<<"NO\n";

下面是第一種做法的AC碼

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, k, m;
int main()
{
    cin>>n;
    while(n--)
    {
        scanf("%lld",&m);
        //cout<<m<<endl;
        while(m)
        {
            if(m % 2 == 0)
                m /= 2;
            else
                break;
        }
        //cout<<m<<endl;
        if(m % 2 == 1 && m != 1)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

E - New Year's Number

題意:

給你一個數,讓你判斷是不是由2020或2021組成的

思路:

因為2020與2021相差不大,2021可以看出2020 + 1,所以我們可以對2020取餘,得到餘數a,再用那個數除以2020,得到商b,只需要比較b是否大於等於a即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, k, m, ans;
int main()
{
    cin>>n;
    while(n--)
    {
        cin>>m;
        k = m % 2020;
        ans = m / 2020;
        if(ans >= k)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}


K - 取石子游戲

題意:

給你兩堆石子,有兩種取法,一是從任意一堆中取任意數量的石子,或者是同時對兩堆取相同數量的石子,最後取完的人勝,你先手,如果最後是你贏就輸出1,否則輸出0

思路:

得先找到必敗點,也就是奇異局勢

(0,0)(1,2)(3,5)(4,7)……

這些都是必敗點,可以發現數之間的差值是成等差數列的,而且所有的自然數都包含在所有的必敗點上。

剩下的就是找規律了

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-ni1Q3g24-1611845112193)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210126205904000.png)]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b;
int main()
{
    while(cin>>a>>b)
    {
        if(a > b)
            swap(a, b);
        if((int)((b - a) * (sqrt(5.0) + 1.0) / 2.0) == a)
            cout<<0<<endl;
        else
            cout<<1<<endl;
    }
    return 0;
}

a) * (sqrt(5.0) + 1.0) / 2.0) == a)
cout<<0<<endl;
else
cout<<1<<endl;
}
return 0;
}

相關文章