4/29上午 vp cf 868
AB赛时就过了
C
这道题的意思是已知数组a,求出数组b,要求数组的乘积相等且每一个数都是strongly compiste。也就是这个数要拥有非素数非本身的因数,通过观察可得,要不就是两个相同的素数组成,要不就是三个不同的素数。那第一步就是将整个a数组变为素数,然后合并
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1010];
map<int,int>mp;
set<int>s;
int32_t main(){
int t;
cin>>t;
while(t--) {
mp.clear();
s.clear();
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
for (int j = 2; j*j<=a[i]; j++) {
while (1) {
if (a[i] % j != 0)
break;
mp[j]++;
s.insert(j);
a[i] /= j;
}
}
if(a[i]!=1){
mp[a[i]]++;
s.insert(a[i]);
}
}
int ans = 0, sum = 0;
for (auto e: s) {
ans += mp[e] / 2;
sum += mp[e] % 2;
}
cout << ans + sum / 3 << endl;
}
return 0;
}
4.29下午 vp cf 864
赛后补了C
C
是一个很简单的交互题,但不会交互题的格式,这道题本身只是考察了切比雪夫距离,对于最小步数,从1 1 点出发,有贡献的走法只有向上,向右和右上,注意,这道题的样例是假的,推样例推了好久
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ask(int x,int y){
cout<<"? "<<x<<" "<<y<<endl;
fflush(stdout);
scanf("%lld",&x);
return x;
}
void answer(int x,int y){
cout<<"! "<<x<<" "<<y<<endl;
fflush(stdout);
return ;
}
int32_t main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
int d;
d=ask(1,1);
if(d>n-1){
int dd=ask(1,1+d);
answer(1+dd,1+d);
}
else if(d>m-1){
int dd=ask(1+d,1);
answer(1+d,1+dd);
}
else{
int x1=ask(1+d,1);
int x2=ask(1,1+d);
if(x1==x2&&x1==d){
answer(1+d,1+d);
}
else if(x2==d){
answer(1+d,1+x1);
}
else{
answer(1+x2,1+d);
}
}
}
return 0;
}
4.29 晚上 补上午和下午的题+cf 869
C有点难,还没补出来
4.30 上午 cf 860
C
这道题就是题读假了,必须是连续的才能贴同一个价签,其实价签上的值为a[i]*b[i]的因数,而且要为b[i]的倍数
#include<bits/stdc++.h>
using namespace std;
#define int long long
int gcd(int x,int y){
if(x%y==0){
return y;
}
else{
return gcd(y,x%y);
}
}
int a[200010],b[200010];
int32_t main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld%lld",&a[i],&b[i]);
}
int d=0,g=1;
int ans=1;
int x;
for(int i=1;i<=n;i++){
d=gcd(d,a[i]*b[i]);
x=gcd(g,b[i]);
g=g/x*b[i];
//cout<<d<<" "<<g<<endl;
if(d%g!=0){
ans++;
//cout<<i<<endl;
d=0;
g=1;
d=gcd(d,a[i]*b[i]);
x=gcd(g,b[i]);
g=g/x*b[i];
}
}
cout<<ans<<endl;
}
return 0;
}
4.30 下午 edc 144
C
对于第一个答案,很明显就是左右log2,因为按照贪心,乘二是增长速度最慢的。
这题我原先想法是dp,从r开始跑。但是发现会超时,题解好简单,但规律还没搞懂。