Codeforces Round #729 (Div. 2) A~C
由于期末周打的比赛,现在才有时间补题,太心痛了~~~并且前三题还都是数学题!!!
A.Odd Set
- 题意:给出2n个数,问是否可以将这2n个数分成n个对(a, b),每个对之和(a+b)为奇数。
- 题解:元素总个数为偶数个,若想满足每两个数组合为奇数,说明这2n个数中奇数的个数必须等于偶数的个数。
- 代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int main()
{
cin >> t;
while(t --)
{
int n, cnte = 0, cnto = 0;
cin >> n;
n *= 2;
for(int i = 1; i <= n; i++)
{
int a;
cin >> a;
if(a % 2 == 0) cnte ++;
else cnto ++;
}
if(cnte == cnto) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
B.Plus and Multiply
- 题意:初值为t = 1,有两种操作,t * a 或者 t + 1,操作完的数可以视作新的t,然后也是有两种一样的操作,当给出一个数n,问时候能经过这样的若干次操作得到n值。 (其实就是给出一个n,问是否能用a ^ x + by表示)
- 题解:因为 (b + t) * a 可以等于 t * a + a * b,那么说明无论是t先加上b还是先乘a,最终都可以转变成t先成a然后加上若干个b,那么我们就可以枚举ak(ak <= n),判断每次(n - a^k) mod b 是否为0即可,时间复杂度为O(logN),a = 1需要特判,不然最坏时间复杂度就要到O(N),会T掉。
ps:看到其他巨佬的精辟总结:其实就是判断是否存在n % b = a^k % b。 - 代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll n, a, b;
int main()
{
cin >> t;
while(t --)
{
int flag = 0;
cin >> n >> a >> b;
//特判
if(a == 1)
{
if( (n - 1) % b == 0) flag = 1;
}
else
{
for(ll i = 1; i <= n && !flag; i *= a)
{
ll x = n - i;
if(x % b == 0) flag = 1;
}
}
if(flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
C.Strange Function
- 题意:f(i)的值为一个最小正整数x不是i的除数(i % x != 0),给出一个n值,求f(1) + f(2) + ... + f(n) 之和并对1e9 + 7取模。
- 题解:数论题,比赛的时候打表还是不太能发现规律,只知道和lcm或者gcd有关,先留坑...

浙公网安备 33010602011771号