五一训练

4/29上午 vp cf 868

image
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

image
赛后补了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

image

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

image

C

对于第一个答案,很明显就是左右log2,因为按照贪心,乘二是增长速度最慢的。
这题我原先想法是dp,从r开始跑。但是发现会超时,题解好简单,但规律还没搞懂。

posted @ 2023-04-30 21:17  zyzzzzlh  阅读(17)  评论(0)    收藏  举报