The 2021 CCPC Weihai Onsite
阿新 • • 發佈:2022-03-20
比賽連結:
https://codeforces.com/gym/103428
A. Goodbye, Ziyin!
題目大意:
\(n - 1\) 條邊連線 \(n\) 個點,但是不知道根節點是哪個,判斷有多少個節點作為根節點時,樹是二叉樹。
思路:
當某個節點的度等於 3 的時候,它肯定不能作為根節點。
當某個節點的度大於 3 的時候,不論如何都不可能形成二叉樹,即沒有一個節點能作為根節點。
程式碼:
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10; int a, b, e[N], ans, n; int main(){ cin >> n; for (int i = 1; i <= n - 1; ++ i){ scanf("%d%d", &a, &b); e[a]++; e[b]++; } for (int i = 1; i <= n; ++ i){ if (e[i] > 3){ cout << "0\n"; return 0; } if (e[i] <= 2) ans++; } cout << ans << "\n"; return 0; }
J. Circular Billiard Table
題目大意:
圓形桌面,球從邊緣上某一個點以 \(\frac{a}{b}\) 這個角度入射,當球碰到桌面時,以對稱的角度彈回,判斷球碰撞多少次後第一次回到入射點,若不能回去,則輸出 -1。
思路:
設碰撞了 \(n\) 次,總共走了 \(k\) 圈。
可以得到公式,\(n * 2 * \alpha == k * 360\),答案就是 \(n - 1\),\(n = \frac{k * 180 * b}{a}\),又因為求的是第一次回到起點的碰撞次數,所以將 180 * \(b\) 和 \(a\) 進行一個約分,再令 \(k = a\),就解出答案了。
程式碼:
#include <bits/stdc++.h>
using namespace std;
#define LL long long
LL T, a, b;
void solve(){
scanf("%lld%lld", &a, &b);
LL t = __gcd(a, 180 * b);
cout << 180 * b / t - 1 << "\n";
}
int main(){
cin >> T;
while (T--)
solve();
return 0;
}