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;
}