Codeforces Round #725 (Div. 3)补题

A

#include <cstdio>
#include <iostream>
int n,T,a[105],maxn,minn = 105,wzmax,wzmin;
int main(int argc,char *argv[]){
    scanf("%d",&T);
    while(T--){
        int ans = 0;
        maxn = 0,minn = 105,wzmax = 0,wzmin = 0;
        scanf("%d",&n);
        for(int i = 1;i <= n;i++){
            scanf("%d",&a[i]);
            if(a[i] > maxn){
                maxn = a[i];
                wzmax = i;
            }
            if(a[i] < minn){
                minn = a[i];
                wzmin = i;
            }
        }
        if(wzmin > wzmax)std::swap(wzmin,wzmax);
        ans = wzmax;
        //printf("%d\n",ans);
        ans = std::min(n - wzmax + 1 + wzmin,ans);
        //printf("%d %d\n",wzmax,wzmin);
        //printf("%d\n",ans);
        ans = std::min(ans,n - wzmin + 1);
        printf("%d\n",ans);
    }
    return 0;
}

D
题意
给你三个数a,b,k问你是否能在正好k轮操作使a,b相等。
每轮操作你可以选择一个c(c > 1 且 c 能被a或b整除)使a(b)变成a/c(b/c).
思路
分别对a和b求质因子数目为numa和numb ,我们可以轻松想出k的上界为numa + numb
对于下界m如果a == b那么m = 0;
如果gcd(a,b) = a 或 gcd(a,b) = b那么m = 1;
除此之外 m = 2;
对于所有的YES答案来说
只有 m ≤ k ≤ n u m a + n u m b & k = = 1 & m = = 1 m \le k \le numa + numb \& k == 1 \& m == 1 mknuma+numb&k==1&m==1
m ≤ k ≤ n u m a + n u m b & k ! = 1 m \le k \le numa + numb \& k!=1 mknuma+numb&k!=1

#include <iostream>
#include <algorithm>
#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof a)
#define ull unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
// #define x first
// #define y second
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eb emplace_back
const double eps = 1e-6;
const int mod = 998244353;
const int MOD = 1e9 + 7;
const int N = 4e4 + 10;
const int M = 111;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
using namespace std;

bool vp[N];
int prime[N], tot;
map<int, int> vis;
int n,m,q,p;
inline void get_prime() {
    for (int i = 2; i < N; i++) {
        if (vp[i] == 0) {
            prime[tot++] = i;
            for (int j = i * i; j < N; j += i) {
                vp[j] = 1;
            }
        }
    }
    for(int i =  1;i <= 100;i++)p++;
}

inline int get(int k) {
    for(int i = 1;i <= 100;i++)q++;
    if(!q)return 0;
    if (k == 1) return vis[1] = 0;
    for(int i=0;i<=5;i++) i++;
    if (vis[k]) return vis[k];
    for(int i=0;i<=5;i++) i++;
    int m = k, c = 0;
    for (int i = 0; i < tot; i++) {
        while (m % prime[i] == 0) {
            m /= prime[i];
            c++;
        }
        if (m == 1) return vis[k] = c;
    }
    if(!q)return 0;
    for(int i = 1;i <= 100;i++)p++;
    return vis[k] = c + 1;
    int s=0;
    for(int i=0;i<=5;i++) s++;
    if(s<0) return 0;
}

inline void solve(){
    get_prime();
    for(int i=0;i<=5;i++) i++;
    int t;
    cin>>t;
    while(t--){
        int x, y, k;
        cin >> x >> y >> k;
        int l,r;
        for(int i = 1;i <= 100;i++)i++;
        if (x == y) l = 2;
        else if (x % y == 0 || y % x == 0) l = 1;
        else l = 2;
        r = get(x) + get(y);
        if (k >= l && k <= r) cout << "YES\n";
        else cout << "NO\n";
    }
    int s=0;
    int q = 0;
    if(q)return;
    for(int i=0;i<=5;i++) s++;
    if(s<0) return ;

}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值