https://codeforces.com/contest/1542/problem/A
A. Odd Set
题意:给你一个n,输入2*n个数字,问你能不能凑出n对数,每对数之和是奇数,如果可以就输入YES,否则就输入 NO。
思路:记录奇数的个数,偶数的个数,当且仅当奇数个数等于偶数个数才能凑出n对,否则就凑不出。
代码:
#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int MAXX=2e5+5;
using namespace std;
inline int read()
{
ll s=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
return s*f;
}
void solve()
{
int n,odd=0,even=0;
cin>>n;
for(int i=1;i<=2*n;i++)
{
int x;
cin>>x;
if(x%2==0)even++;
else odd++;
}
if(even==odd)
{
cout<<"YES\n";
}
else cout<<"NO\n";
}
int main()
{
ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
https://codeforces.com/contest/1542/problem/B
B. Plus and Multiply
题意:给你三个数n,a,b;在一个无限长的序列里,其中1是序列里的其中一个成员值,每次操作你时成员值*a,或者b+成员值,把结果添变成序列里的一名新成员值。问n是该序列的一名成员?
思路: 直接看样例:
24 3 5,分析:24=3^2+5*3; 2345 1 4,分析:2345=1+(2344/4);
19260817 233 264,分析:19260817=233^2+(19206528/264);
发现规律了吗?特例就是当a=1时,直接判断(n-1)是否能被b整除就行了
其他情况就是判断(n-a^k)%b如果等于0那么就可以构成(a^k<=n)。
代码:
#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int MAXX=2e5+5;
using namespace std;
inline int read()
{
ll s=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
return s*f;
}
void solve()
{
ll n,a,b;
cin>>n>>a>>b;
if(a==1)
{
if((n-1)%b==0)cout<<"YES\n";
else cout<<"NO\n";
return;
}
else
{
ll temp=1;
while(temp<=n)
{
if((n-temp)%b==0)
{
cout<<"YES\n";
return ;
}
temp*=a;
}
cout<<"NO\n";
}
}
int main()
{
ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}