zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    [TCP IP详解:学习笔记]UDP:用户数据协议
    [TCP IP详解:学习笔记]IP选路
    [TCP IP详解:学习笔记]IP:网络协议
    [TCP IP详解:学习笔记]TCP连接的建立与终止
    [TCP IP详解:学习笔记]ICMP:Internet控制报文协议
    [TCP/IP详解:学习笔记]链路层
    [TCP/IP详解:学习笔记]ARP:地址解析协议
    [TCP IP详解:学习笔记]TCP:传输控制协议
    [TCP IP详解:学习笔记]广播和多播
    [TCP IP详解:学习笔记]IGMP:Internet组管理协议
  • 原文地址:https://www.cnblogs.com/163467wyj/p/12892607.html
Copyright © 2011-2022 走看看