链接:https://codeforces.com/contest/1542
A. Odd Set
题意:有2n个数,把他分成n对,让每一对都是奇数
题解:每对都是奇数,必然是一奇一偶,n对就有n个奇数,判断是否有n个奇数,有则Yes,否则No即可
#include<bits/stdc++.h>
using namespace std;
int main(){
int t; cin >> t;
while (t--)
{
int n; cin >> n;
int cnt = 0;
for(int i = 0; i < 2 * n; i++){
int x; cin >> x;
if(x & 1) cnt++;
}
if(cnt == n) cout << "YES\n";
else cout << "NO\n";
}
}
B. Plus and Multiply
题意:一个集合一开始有一个数:1,如果一个数x在集合里,那么a·x和x + b也在集合里,给出一个数,判断它是否在集合里( 1 ≤ n , a , b ≤ 1 0 9 1\le n,a,b \le 10^9 1≤n,a,b≤109)
题解:
-
n = a k 1 + k 2 ∗ b n = a^{k_1} + k_2 * b n=ak1+k2∗b
-
由题意可知,该方程有解,根据题意给出公式,可知
b ∗ k 2 ≥ 0 a k 1 ≤ n b * k_2 \ge 0 \\ a^{k_1} \le n b∗k2≥0ak1≤n -
判断在 0 ≤ a k 1 ≤ n 0 \le a^{k_1} \le n 0≤ak1≤n范围内,有无 n − a k 1 = b ∗ k 2 n - a^{k_1} = b * k_2 n−ak1=b∗k2即可,即 n − a k 1 % b = 0 n - a^{k_1} \% b = 0 n−ak1%b=0
注意写代码的时候要防止 a = 1 时,
while(a^k1 <= n)
陷入死循环
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int t; cin >> t;
while (t--)
{
ll n,a,b; cin >> n >> a >> b;
ll temp = 1;
bool flag = false;
if(a == 1){
if( (n - 1) % b == 0)
cout << "Yes\n";
else
cout << "No\n";
} else {
while(temp <= n){
if((n - temp) % b == 0){
flag = true;
break;
}
temp *= a;
}
if(flag)
cout << "Yes\n";
else
cout << "No\n";
}
}
return 0;
}
C. Strange Function
题意:定义 f ( x ) f(x) f(x)是 x x x的最小的非因子正整数,求 ∑ i = 1 n f ( i ) ∑_{i=1}^nf(i) ∑i=1