cf641 div2 abcd

传送门


A Orac and Factors standard input/output 2 s, 256 MB Submit Add to favourites x13533

 k = 1时,n += d(n),  k > 1时, n += 2, 因为第一步加了以后n肯定变成了一个偶数  O(log n)
B Orac and Models standard input/output 3 s, 256 MB Submit Add to favourites x8248

直接进行枚举, 用dp 记录,  i 1-n 遍历每个数字的倍数 O(n*sqrt(n))

C Orac and LCM standard input/output 3 s, 256 MB Submit Add to favourites x5159

个人感觉这题比D题难多了, 结论   pk  ans , 当且仅当:对于 i=1,2,3,...,ni=1,2,3,...,n ,有至少 n-1n1 个 ii 满足 p^k |  ai (证明没看懂),就是说 ans 的每个质因子 至少有n-1的数可以整除

然后两种做法,

1、对于 ai , 产生的 lcm 为 lcm(ai , ai+1) , lcm(ai , ai+2) ... lcm(ai , an)

  产生的 gcd_i 为 gcd ( lcm(ai , ai+1) , lcm(ai , ai+2) ... lcm(ai , an) )

  因为参与 gcd_i 的每一项都是 ai 的倍数 (传送门

  所以 gcd( lcm(ai , ai+1) , lcm(ai , ai+2) ... lcm(ai , an) ) 可以化为 lcm (ai , gcd (ai+1 , ai+2 , ... an) )

  那么最后答案就为 ans = gcd( gcd_1 , gcd_2 , ... gcd_n ) , 我们用一个后缀数组就可以了

2、分解每个数的质因子 求出每个质因子的 n-1 个数满足的最小情况 
     具体做法是把每个数的质因子的幂次压入数组  数组排序后取第n-1小的元素累乘就是答案

 3、因为至少n-1个数能整除, 把ai 每个数都去除一次组成的n-1个元素数组的gcd算一下, 然后把这个n个gcd值求下 lcm 即可
  快速求n-1个元素 数组的gcd 可以用前缀数组和后缀数组简化   例如求除去ai的 n-1个元素数组gcd =  gcd(gcd(a1,a2,....,ai-1),  gcd(ai+1, ai+2....an));

D Orac and Medians standard input/output 2 s, 256 MB Submit Add to favourites x2005

如果数组中不存在k, 那么很明显无法成功, 当数组中存在k时, 只需要存在连续的三个数 其中有两个数大于等于k 则必有解
假设三个数为 k k+1 k-1  或者 k+1 k+1 k  或者 k k x  那么显而易见可以变成 k k k 然后就可以自由扩散将别的数字变成 k,
假设三个数为 k+1 k+1 k-1 那么显而易见可以变成 k+1 k+1 k+1 然后就可以自由扩散将别的数字变成 k+1, 直到遇见数字 k 时, 再将其他数字变成 k 。。。
其他情况大致如此, 故遍历一遍看是否有 k 存在 且 连续三个数 两个数满足大于等于 k 即可, O(n)

#include <bits/stdc++.h> 
using namespace std;
#define ll long long
#define _for(i,a,b) for(int i = (a); i < (b); i++) 
#define _rep(i,a,b) for(int i = (a); i <= (b); i++)
void taskA1() {
    int t; cin >> t;
    while(t--) {
        int n,k;
        cin >> n >> k;
        int q = sqrt(n), x = n;
        _rep(i,2,q) if(n%i == 0) { x = i; break;}
        n = n+x+(k-1)*2;
        cout << n << "
";
    }
    return;
}
void taskB1() {
    int t; cin >> t;
    while(t--) {
        int n; cin >> n;
        vector<int> a(n+1), f(n+1, 1);
        _rep(i,1,n) cin >> a[i];
        _rep(i,1,n) 
        for(int j = 2*i; j <= n; j+=i) {
            if(a[i] < a[j]) 
                f[j] = max(f[j], f[i]+1);
        }
        int ans = 0;
        _rep(i,1,n) ans = max(ans, f[i]);
        cout << ans << "
";
    }
    return;
}
void taskB1() {
    int t; cin >> t;
    while(t--) {
        int n; cin >> n;
        vector<int> a(n+1, 0), f(n+1,1);
        _rep(i,1,n) cin >> a[i];
        int ans = 1;
        _rep(i,1,n)
        {
            int q = sqrt(i);
            _rep(j,1,q) {
                if(i%j==0) {
                    if(a[j] < a[i]) f[i] = max(f[i], f[j]+1);
                    if(a[i/j] < a[i])   f[i] = max(f[i], f[i/j]+1);
                }
            }
        }
        _rep(i,1,n) ans = max(ans, f[i]);
        cout << ans << "
";    
    } return;
}
int gcd(int a, int b) { return !b? a : gcd(b, a%b);}
int lcm(int a, int b) { return a*b/gcd(a,b);}
void taskC11() {
    int n; cin >> n;
    vector<int> a(n+1), suf(n+1, 0);
    _rep(i,1,n) cin >> a[i];
    for(int i = n; i > 0; i--) suf[i] = gcd(suf[i+1], a[i]);
    int ans = 0;
    _rep(i,1,n) ans = gcd(ans, lcm(a[i], suf[i+1]));
    cout << ans << "
";
    return;
}
ll fpow(ll a, ll b) {
    ll ret = 1;
    while(b) {
        if(b & 1) ret = ret*a;
        b >>= 1;
        a *= a;
    }
    return ret;
}
const int N = 2e5+10;
int prime[N],vis[N],cnt;
vector<int> g[N];

void init(int n) {
    _rep(i,2,n) {
        if(!vis[i]) prime[++cnt] = i, vis[i] = i;
        for(int j = 1; j <= cnt and i*prime[j] <= n; j++)
        {
            vis[prime[j]*i] = prime[j];
            if(i%prime[j] == 0) break;
        }
    }
    return;
}
void taskC12() {
    
    int n; cin >> n;
    init(N-10);
    vector<int> a(n); 
    _for(i,0,n) cin >> a[i];
    /*
    _for(i,0,n) 
    {
        int x1 = a[i];
        _rep(j,2,a[i]) 
        {
            if(j*j > a[i]) break;
            if(x1%j == 0) {
                int x2 = 0;
                while(x1%j == 0) x1 /= j, x2++;
                g[j].push_back(x2);
            } 
        }if(x1 > 1) g[x1].push_back(1); 
    }
    */
    _for(i,0,n) {
        int y = a[i];
        _rep(j,1,a[i]) // a
        {
            int x = prime[j];
            if(x*x > y) break;
            if(y%x == 0) {
                int c = 0; 
                while(y%x == 0) y /= x, c++;
                g[x].push_back(c);
            }
        }   
        if(y > 1) g[y].push_back(1);
    }
    
    ll ans = 1;
    _rep(i,1,cnt) {
        int x = prime[i];
        if(g[x].empty()) continue;
        sort(all(g[x]));
        if(g[x].size() == n) ans *= fpow(x, g[x][1]);
        else if(g[x].size() == n-1) ans *= fpow(x, g[x][0]);
    }
    cout << ans << "
";
    return;
}
void taskC1() {
    taskC12(); // soultion 2
    //taskC11(); // soultion 1
    return;
}
void taskD1() {
    int t; cin >> t;
    while(t--) {
        int n,k; cin >> n >> k;
        vector<int> a(n);
        int f1 = 0;
        _for(i,0,n) cin >> a[i], f1 |= (a[i]==k);
        if(!f1) { cout << "no
"; continue; }
        if(n==1) 
            { cout << "yes
"; continue; }
        _for(i,0,n) {
            if(a[i] == k) a[i] = 1;
            else if(a[i] > k) a[i] = 2;
            else a[i] = 0;
        }
        int f = 0;
        _for(i,0,n) {
            if(i < n-1 and a[i] && a[i+1]) f = 1;
            if(i < n-2 and a[i] && a[i+2]) f = 1;
        }
        cout << (f?"yes
":"no
");
    }
    return;
}
 
int main(){
    ios::sync_with_stdio(false), cin.tie(nullptr);
    //taskA1(); //cf641div2
    //taskB1();
    //taskC1();
    taskD1();
    return 0;
}
原文地址:https://www.cnblogs.com/163467wyj/p/12892607.html