zoukankan      html  css  js  c++  java
  • F. Classical? (数论 + 思维 + 推理 + 容斥)

    题目传送门

     题解1

    题解2

    #include <bits/stdc++.h>
    #define LL long long
    #define mem(i, j) memset(i, j, sizeof(i))
    #define rep(i, j, k) for(int i = j; i <= k; i++)
    #define dep(i, j, k) for(int i = k; i >= j; i--)
    #define pb push_back
    #define make make_pair
    #define INF INT_MAX
    #define inf LLONG_MAX
    using namespace std;
    
    template <typename T>
    void read(T &x) {
        int s = 0, c = getchar();
        x = 0;
        while (isspace(c)) c = getchar();
        if (c == 45) s = 1, c = getchar();
        while (isdigit(c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
        if (s) x = -x;
    }
    
    template <typename T>
    void write(T x, char c = ' ') {
        int b[40], l = 0;
        if (x < 0) putchar(45), x = -x;
        while (x > 0) b[l++] = x % 10, x /= 10;
        if (!l) putchar(48);
        while (l) putchar(b[--l] | 48);
        putchar(c);
    }
    
    const int N=1e5+8;
    
    bool sign[N];
    
    int n,ma,u[N],cnt[N];
    
    LL ans = 1LL;
    
    vector<int> d[N];
    
    stack<LL> s;
    
    void pre(){
        for(int i=1;i<=ma;++i){
            for(int j=i;j<=ma;j+=i) d[j].push_back(i);
            if (i==1) u[i]=1;
            else if (i/d[i][1]%d[i][1]==0) u[i]=0;
            else u[i]=-u[i/d[i][1]];
        }
    }
    
    int coprime(int x){
        int tmp=0;
        for(int i:d[x])
            tmp+=u[i]*cnt[i];
        return tmp;
    }
    
    void updata(int x,int val){
        for(int i:d[x])
            cnt[i]+=val;
    }
    
    int main(void) {
        //ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    //    freopen("input.txt", "r", stdin);
    //    freopen("output.txt", "w", stdout);
        read(n);
        for(int a,i=1;i<=n;++i){
            read(a);
            sign[a]=true;
            ma=max(ma,a);
        }
        pre();
        for(int i=1;i<=ma;++i)
            for(int j=2;i*j<=ma;++j)
                sign[i]|=sign[i*j];
        for(int qwq,i=ma;i>=1;--i) {
            if (!sign[i]) continue;
            qwq=coprime(i);
            while(qwq){
                if (__gcd(s.top(),(LL)i)==1){
                    ans=max(s.top()*(LL)i,ans);
                    --qwq;
                }
                updata(s.top(),-1);
                s.pop();
            }
            updata(i,1);
            s.push((LL)i);
        }
        write(ans,'
    ');
        return 0;
    }
    View Code
    一步一步,永不停息
  • 相关阅读:
    HTML5 自动聚焦 属性
    c语言学习笔记(2)——预备知识
    java实现文件的上传和下载
    拓网超大文件上传组件
    java+下载+大文件断点续传
    word内容带样式粘贴到富文本编辑器
    php上传整个文件夹
    超大文件上传系统
    java+web中上传文件夹
    vue上传文件
  • 原文地址:https://www.cnblogs.com/Willems/p/12288666.html
Copyright © 2011-2022 走看看