zoukankan      html  css  js  c++  java
  • Bzoj 2190 仪仗队(莫比乌斯反演)

    题面

    bzoj

    洛谷

    题解

    看这个题先大力猜一波结论

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using std::min; using std::max;
    using std::swap; using std::sort;
    using std::__gcd;
    typedef long long ll;
    
    template<typename T>
    void read(T &x) {
        int flag = 1; x = 0; char ch = getchar();
        while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
        while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
    }
    
    const int N = 4e4 + 10;
    int n, ret;
    bool a[N][N];
    
    int main () {
    #ifdef OFFLINE_JUDGE
        freopen("233.in", "r", stdin);
        freopen("233.out", "w", stdout);
    #endif
        scanf("%d", &n);
        for(int i = 2; i <= n; ++i)
            for(int j = 2; j <= n; ++j) {
                int tmp = __gcd(i, j);
                int tmpi = i / tmp, tmpj = j / tmp;
                if(!a[tmpi][tmpj]) ++ret, a[tmpi][tmpj] = true;
            }
        printf("%d
    ", ret + 2);		
        return 0;
    }
    

    然后:

    1.jpg

    很接近了,仔细一想,应该是:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using std::min; using std::max;
    using std::swap; using std::sort;
    using std::__gcd;
    typedef long long ll;
    
    template<typename T>
    void read(T &x) {
        int flag = 1; x = 0; char ch = getchar();
        while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
        while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
    }
    
    const int N = 4e4 + 10;
    int n, ret;
    bool a[N][N];
    
    int main () {
    #ifdef OFFLINE_JUDGE
        freopen("233.in", "r", stdin);
        freopen("233.out", "w", stdout);
    #endif
        scanf("%d", &n);
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < n; ++j) {
                int tmp = __gcd(i, j);
                if(tmp == 1) ++ret/*, a[tmpi][tmpj] = true*/;
            }
        printf("%d
    ", ret);
        return 0;
    }
    

    然后过了:

    2.jpg

    那不就是$Bzoj1101 Zap$了,直接蒯(注意特判一下$n==1$的情况)

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using std::min; using std::max;
    using std::swap; using std::sort;
    typedef long long ll;
    
    template<typename T>
    void read(T &x) {
        int flag = 1; x = 0; char ch = getchar();
        while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
        while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
    }
    
    const int N = 4e4 + 10;
    int t, n, mu[N], g[N], prime[N], cnt;
    long long sum[N]; bool notprime[N];
    
    void getmu(int k) {
        mu[1] = 1;
        for(int i = 2; i <= k; ++i) {
            if(!notprime[i]) prime[++cnt] = i, mu[i] = -1;
            for(int j = 1; j <= cnt && prime[j] * i <= k; ++j) {
                notprime[prime[j] * i] = true;
                if(!(i % prime[j])) break;
                mu[prime[j] * i] = -mu[i];
            }
        }
        for(int i = 1; i <= k; ++i)
            sum[i] = sum[i - 1] + 1ll * mu[i];
    }
    
    int main () {
    #ifdef OFFLINE_JUDGE
        freopen("233.in", "r", stdin);
        freopen("233.out", "w", stdout);
    #endif
        getmu(40000); 
        read(n); ll ans = n > 1 ? 2 : 0; --n;
        for(int l = 1, r; l <= n; l = r + 1) {
            r = n / (n / l);
            ans += (sum[r] - sum[l - 1]) * (n / l) * (n / l);
        }
        printf("%lld
    ", ans);
        return 0;
    }
    
  • 相关阅读:
    ViewPager实现页卡的最新方法--简洁的TabLayout(谷歌支持包)
    Android 使用Fragment,ViewPagerIndicator 制作csdn app主要框架
    TelephonyManager
    Android之CookieStore的持久化
    Android中使用HTTP服务
    Android HttpClient基本使用方法
    Android Https相关完全解析 当OkHttp遇到Https
    告诉你月薪3万的程序员都避开了哪些坑?
    计算机上面常用的计算单位 & 个人计算机架构与接口设备
    计算机硬件的五大单元 & CPU的种类 & 计算机的运行流程
  • 原文地址:https://www.cnblogs.com/water-mi/p/10185146.html
Copyright © 2011-2022 走看看