• HDU6434 Count【欧拉函数 线性筛】


    HDU6434 I. Count

    T次询问,每次询问(sum_{i=1}^{n}sum_{j=1}^{n-1}[gcd(i-j,i+j)=1])

    (Tle 1e5, n le 2e7)

     对原式进行转换,枚举(i-j)(i-j)(j) ,那么可以变换为(sum_{i=1}^{n}sum_{j=1}^{i-1}[gcd(j,2i-j)=1]) 

     (Rightarrow sum_{i=1}^{n}sum_{j=1}^{i-1}[gcd(j,2i)=1]) 

    也就是计算([1,i-1])中与(2i)互质的数的个数,也即和(i)互质的奇数的个数 = $frac{phi(2i)}{2} $ 

    所以答案就是: (sum_{i=1}^{n}frac{phi(2i)}{2} 线性筛预处理之后可以O(1)得到答案) 

    //#pragma GCC optimize("O3")
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<bits/stdc++.h>
    using namespace std;
    function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
    const int MAXN = 2e7+7;
    using LL = int_fast64_t;
    int phi[MAXN];
    LL sum[MAXN];
    void calphi(){
        for(int i = 1; i < MAXN; i++) phi[i] = i;
        vector<int> prime;
        for(int i = 2; i < MAXN; i++){
            if(phi[i]==i){
                prime.emplace_back(i);
                phi[i] = i - 1;
            }
            for(int j = 0; j < (int)prime.size(); j++){
                if(i*prime[j]>=MAXN) break;
                phi[prime[j]*i] = phi[prime[j]] * phi[i];
                if(i%prime[j]==0){
                    phi[i*prime[j]] = phi[i] * prime[j];
                    break;
                }
            }
        }
        for(int i = 1; i < MAXN; i++){
            if(i&1) sum[i] = sum[i-1] + phi[i] / 2;
            else sum[i] = sum[i-1] + phi[i];
        }
    }
    int main(){
        calphi();
        ____();
        int T;
        for(cin >> T; T; T--){
            int n; cin >> n;
            cout << sum[n] << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    我和杨兄的不同的Code First简单权限设计
    JavaScript&JQ 004_JS闭包
    省市区三级联动[JSON+Jquery]
    JavaScript 005_JS数组的CRUD
    linq头脑风暴001_聚合函数
    类成员函数指针的特殊之处
    模拟手算,计算组合数C(m,n)
    命令行版扫雷(vc08)
    UNICODE,GBK,UTF8:编码格式的区别
    画高频PCB的心得
  • 原文地址:https://www.cnblogs.com/kikokiko/p/12571063.html
Copyright © 2020-2023  润新知