A. 2023
题意:序列a中所有数的乘积应为2023,现在给出序列中的n个数,找到剩下的k个数并输出,报告不可能。
思路:把所有已知的数字乘起来,判断是否整除2023,不够的k补1,注意当前乘积已经大于2023的情况。
AC code:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
ll n,k;cin>>n>>k;
vector<ll>a(n+1);
ll sum=1;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
sum*=a[i];
}
ll s=2023/sum;
if(s*sum==2023)
{
cout<<"YES"<<'\n';
cout<<s<<' ';
for(ll i=2;i<=k;i++) cout<<1<<' ';
cout<<'\n';
}
else cout<<"NO"<<'\n';
}
int main()
{
ll t;cin>>t;
while(t--) solve();
return 0;
}
B. Two Divisors
题意:给出正整数的两个最大的除数a和b,求x。
思路:首先是找出a和b的最小公倍数lcm,然后判断lcm是否为较大的除数:
如果是,说明a是b的除数,且a和b还是x最大的两个除数,当前的最小公倍数是b,b/a为当前b最大能放大的倍数,则x=b*(b / a);
否则,x=lcm。
AC code:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
ll a,b;cin>>a>>b;
ll x=gcd(a,b);
ll xx=a/x,yy=b/x;
if(x==1&&a!=1) cout<<a*b<<'\n';
else if(x==1&&a==1) cout<<b*b<<'\n';
else if(xx==1) cout<<x*yy*yy<<'\n';
else cout<<xx*yy*x<<'\n';
}
int main()
{
ll t;cin>>t;
while(t--) solve();
return 0;
}
C. Training Before the Olympiad
题意:
在一个长度为n的正整数数组中,A和B轮流操作:
每次选择两个不同的索引i和j,然后在数组中删除两者并加入一个数
思路:看奇偶:
每次操作选择的两元素奇偶性相同则操作不会影响最终结果,否则会对最终结果-1;
奇数才是影响最终结果的关键,AB无论怎么选择,一次操作后的数字必定是偶数;
对A来说是尽可能选择奇偶性相同的元素,对B则是选择奇偶性不同的元素来缩小最终结果:
A优先选择成对的奇数来减少奇数的数量,一次减少2个奇数,选择一个奇数一次减少1个奇数:
首先前缀和奇数的数量;
各一轮下来最多消灭三个奇数,一次结果-1,再看多出的奇数若为1结果额外-1。
AC code:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
ll n;
cin>>n;
vector<ll>a(n+1);
for(ll i=1;i<=n;i++)cin>>a[i];
ll sum = 0, cnt[2] = {0, 0};
for(ll i=1;i<=n;i++){
sum += a[i];
cnt[a[i]&1]++;
ll res = sum - (cnt[1] / 3 + (i != 1 && cnt[1] % 3 == 1));
cout<<res<<' ';
}
cout<<'\n';
}
int main()
{
ll t;cin>>t;
while(t--) solve();
return 0;
}
D. Mathematical Problem
题意:找出n个n位数(n为奇数),每个数满足各数位的组成的集合相同,且每个数都是一个平方数;
思路:
map打表找规律,会发现神奇的事情:
n = 3
169
196
961
n = 5
10609
16900
19600
61009
90601
96100
n = 7
1006009
1060900
1690000
1960000
6100900
9006001
9060100
9610000
n = 9
100060009
100600900
106090000
169000000
196000000
610090000
900060001
900600100
906010000
961000000
......
然后就是字符串的操作了…
AC code:
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
ll n;cin>>n;
ll x=0;
if(n==1)
{
cout<<1<<'\n';
return;
}
if(n==3)
{
cout<<169<<'\n';
cout<<961<<'\n';
cout<<196<<'\n';
return;
}
for(ll i=1;i<=n/2;i++)
{
cout<<1;
for(ll i=1;i<=x;i++)
{
cout<<0;
}
cout<<6;
for(ll i=1;i<=x;i++)
{
cout<<0;
}
cout<<9;
for(ll i=1;i<=n-2*x-3;i++)
{
cout<<0;
}
cout<<'\n';
cout<<9;
for(ll i=1;i<=x;i++)
{
cout<<0;
}
cout<<6;
for(ll i=1;i<=x;i++)
{
cout<<0;
}
cout<<1;
for(ll i=1;i<=n-2*x-3;i++)
{
cout<<0;
}
cout<<'\n';
x++;
}
cout<<196;
for(ll i=1;i<=n-3;i++) cout<<0;
cout<<'\n';
}
int main()
{
ll t;cin>>t;
while(t--) solve();
return 0;
}