zoukankan      html  css  js  c++  java
  • 牛客 14648 序列 ( 莫比乌斯 )

    题目:传送门

    题意:

     

    思路: gcd(x, y) = 1 想到莫比乌斯

        

           然后我们枚举 i, 然后枚举 j 是 i 的倍数, 那gcd(i, j)  = i 

        然后对这些数,枚举有多少满足 第二个条件的,然后最后累加答案即可。

    #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
    #define PI acos(-1)
    using namespace std;
    
    const int N = 1e6 + 5;
    
    int a[N], b[N];
    
    int mu[N], vis[N], pre[N], tot = 0;
    LL c[N], res[N];
    void init(int n) { ///初始化莫比乌斯函数
        mu[1] = 1;
        rep(i, 2, n) {
            if(!vis[i]) pre[++tot] = i, mu[i] = -1;
            rep(j, 1, tot) {
                if(i * pre[j] > n) break;
                vis[i * pre[j]] = 1;
                if(i % pre[j] == 0) {
                    mu[i * pre[j]] = 0;break;
                }
                else mu[i * pre[j]] = -mu[i];
            }
        }
    }
    
    void solve() {
        int n; scanf("%d", &n);
        init(n);
        rep(i, 1, n) scanf("%d", &a[i]);
        rep(i, 1, n) scanf("%d", &b[i]);
        rep(i, 1, n) { /// 枚举 i 
            for(int j = i; j <= n; j += i) c[a[b[j]]]++; /// 枚举 i 的倍数
            for(int j = i; j <= n; j += i) res[i] += c[b[a[j]]]; /// 累加答案
            for(int j = i; j <= n; j += i) c[a[b[j]]]--; /// 消除影响
        }
        LL ans = 0;
        rep(i, 1, n) ans += res[i] * mu[i];
        printf("%lld
    ", ans);
    }
    
    int main() {
    
        solve();
    
        return 0;
    
    }
    一步一步,永不停息
  • 相关阅读:
    springmvc和struts2的区别(转)
    springmvc和struts2的区别
    sql优化(转)
    java反射机制
    阿里云产品
    vscode 插件推荐
    测试JS方法运行时间
    基于VUE2.0的分页插件(很好用,很简单)
    【软件测试】测试管理工具----禅道
    Vue.js中用webpack合并打包多个组件并实现按需加载
  • 原文地址:https://www.cnblogs.com/Willems/p/12395173.html
Copyright © 2011-2022 走看看