• 题解 P6055 【[RC-02] GCD】


    [ans=sum_{i=1}^Nsum_{j=1}^Nsum_{p=1}^{leftlfloordfrac{N}{j} ight floor}sum_{q=1}^{leftlfloordfrac{N}{j} ight floor}[gcd(i,j)=1][gcd(p,q)=1] ]

    方法1:

    [egin{aligned} ans & = sum_{i=1}^Nsum_{j=1}^Nsum_{p=1}^{leftlfloordfrac{N}{j} ight floor}sum_{q=1}^{leftlfloordfrac{N}{j} ight floor}[gcd(i,j)=1][gcd(p,q)=1] \ & = sum_{i=1}^{N}sum_{j=1}^Nsum_{p=1}^{N}sum_{q=1}^N[gcd(i,j)=1][gcd(p,q)=j] \ & = sum_{i=1}^Nsum_{p=1}^{N}sum_{q=1}^N[gcd(i,p,q)=1] \ & = sum_{d=1}^Nmu(d)leftlfloordfrac{N}{d} ight floor^3 end{aligned} ]

    方法2:

    [egin{aligned} ans & =sum_{i=1}^{N}sum_{j=1}^N(sum_{d|gcd(i,j)}mu(d))(sum_{p=1}^{leftlfloordfrac{N}{j} ight floor}sum_{q=1}^{leftlfloordfrac{N}{j} ight floor}sum_{t|gcd(p,q)}mu(t)) \ & =sum_{i=1}^{N}sum_{j=1}^N(sum_{d|gcd(i,j)}mu(d))(sum_{t=1}^{leftlfloordfrac{N}{j} ight floor}mu(t)leftlfloordfrac{N}{jt} ight floor^2) \ & =sum_{d=1}^Nmu(d)leftlfloordfrac{N}{d} ight floorsum_{j=1}^{leftlfloordfrac{N}{d} ight floor}1cdotsum_{t=1}^{leftlfloordfrac{N}{d} ight floor}leftlfloordfrac{N}{dt} ight floor^2sum_{g|t}mu(t) \ & =sum_{d=1}^Nmu(d)leftlfloordfrac{N}{d} ight floorsum_{j=1}^{leftlfloordfrac{N}{d} ight floor}1cdotsum_{t=1}^{leftlfloordfrac{N}{d} ight floor}leftlfloordfrac{N}{dt} ight floor^2[t=1] \ & =sum_{d=1}^Nmu(d)leftlfloordfrac{N}{d} ight floorsum_{j=1}^{leftlfloordfrac{N}{d} ight floor}1cdotleftlfloordfrac{N}{d} ight floor^2 \ & =sum_{d=1}^Nmu(d)leftlfloordfrac{N}{d} ight floor^3 end{aligned} ]

    然后数论分块+杜教筛即可

    #include<cstdio>
    #include<map>
    #define Starseven main
    #define ll long long
    const int N = 8e6;
    const ll mod = 998244353;
    int prime[N + 20], num;
    ll mu[N + 20];
    bool vis[N + 20];
    std::map<ll,ll> mp;
    
    void Init() {
    	mu[1] = 1;
    	for (int i = 2; i <= N; i++) {
    		if(!vis[i]) {
    			prime[++num] = i;
    			mu[i] = -1ll;
    		}
    		for (int j = 1; j <= num && prime[j] * i <= N; j++) {
    			int x = prime[j] * i;
    			vis[x] = true;
    			if(i % prime[j] == 0) {
    				mu[x] = 0;
    				break;
    			}
    			mu[x] = -mu[i];
    		}
    	}
    	for (int i = 1; i <= N; i++) {
    		mu[i] += mu[i - 1];
    	} 
    	return ;
    }
    
    ll Get_sum(ll x) {
    	if(x <= N) return mu[x];
    	if(mp[x]) return mp[x];
    	ll re = 1;
    	for (ll l = 2, r; l <= x; l = r + 1) {
    		r = x / (x / l);
    		re = (re - (r - l + 1) * Get_sum(x / l)) % mod;
    		re = (re + mod) % mod;
    	}
    	mp[x] = re;
    	return re;
    }
    
    int Starseven(void) {
    	ll n;
    	read(n);
    	Init();
    	ll ans = 0;
    	for (ll l = 1, r; l <= n; l = r + 1) {
    		ll hack = n / l;
    		r = n / (n / l);
    		hack = hack * hack % mod * hack % mod;
    		ans = (ans + (Get_sum(r) - Get_sum(l - 1)) % mod * hack % mod) % mod;
    		ans = (ans + mod) % mod;
    	}
    	write(ans);
    	puts(""); 
    	return 0;	
    }
    
  • 相关阅读:
    基于jenkins+gitlab的自动集成环境的搭建
    函数指针与委托
    详解C#break ,continue, return (转)
    REST 与 web service 的比较
    Python
    python
    python
    python
    python 1.0
    python 0.0
  • 原文地址:https://www.cnblogs.com/starseven/p/13565782.html
Copyright © 2020-2023  润新知