zoukankan      html  css  js  c++  java
  • 题解 P3601 【签到题】

    题目链接

    Solution 签到题

    题目大意:定义(qiandao(n)=sum_{i=1}^{n}[gcd(i,n) eq1]),求(sum_{i=l}^rqiandao(i)),其中(l,rleq 10^{12},r-l leq 10^6)

    数论


    分析:首先(qiandao(n)=n-varphi(n))

    所以我们考虑咋把(sum_{i=l}^{r}varphi(i))求出来

    ([l,r])内每个数利用唯一分解定理分解,由于一个数(n)分解后的指数之和不会超过(log_2n),所以我们只需要求出这个数有哪些质因子,然后暴力求(varphi)即可

    我们筛出([1,sqrt{10^{12}}=10^6])内的所有质数,对于每个质数,将它在([l,r])内的所有倍数打上标记

    根据神欧拉给出的结论,这个的时间复杂度是(nlogn)级别的

    于是我们得到了([l,r])内每个数(x),小于(sqrt{x})的质因子,将它们的幂次全部除掉,得到的数如果不是(1),那它一定是一个大于(sqrt{x})的质因子,我们得到了(x)的所有质因子

    然后愉快的求(varphi)即可

    #include <iostream>
    #include <vector>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e6 + 100,mod = 666623333;
    inline ll add(ll a,ll b){return (a + b) % mod;}
    bool vis[maxn];
    vector<int> pri;
    inline void sieve(){
    	for(int i = 2;i < maxn;i++){
    		if(!vis[i])pri.push_back(i);
    		for(int x : pri){
    			if(1ll * x * i >= maxn)break;
    			vis[i * x] = 1;
    			if(i % x == 0)break;
    		}
    	}
    }
    ll l,r,ans;
    vector<int> vec[maxn];
    int main(){
    	sieve();
    	cin >> l >> r;
    	for(int p : pri){
    		for(ll now = ceil((long double)l / p) * p;now <= r;now += p)
    			vec[now - l].push_back(p);
    	}
    	for(ll now = l;now <= r;now++){
    		ll tmp = now,phi = 1;
    		for(int p : vec[now - l]){
    			phi *= p - 1;
    			tmp /= p;
    			while((tmp % p) == 0){
    				phi *= p;
    				tmp /= p;
    			}
    		}
    		if(tmp != 1)phi *= tmp - 1;
    		ans = add(ans,now - phi);
    	}
    	cout << ans << '
    ';
    	return 0;
    }
    
  • 相关阅读:
    jenkins 配置杂项优化
    Ansible终极速度优化之--- Mitogen Plugin
    jenkins基于Ansible自动发布/回滚/管理
    Jenkins Pipeline 参数详解
    jenkins pipeline 复杂的发布流程
    jenkins 更新插件使用代理
    pipeline 多个参数如何传入
    k8s-jenkins x CI/CD 动态创建slave---01
    k8s集群-node节点设置不可调度或者删除node节点
    Kubelet 证书如何自动续期
  • 原文地址:https://www.cnblogs.com/colazcy/p/13701373.html
Copyright © 2011-2022 走看看