zoukankan      html  css  js  c++  java
  • LOJ #6053. 简单的函数 (min25筛裸题)

    题面

    在这里插入图片描述
    (nle10^{10})

    题解

    裸的min25筛,要学习min25筛的戳这里

    我主要用的是下面那种写法(比较好写)
    在这里插入图片描述
    注意下,对于所有奇质数(f(p)=p-1)(f(2)=3),所以求和的时候就用质数和减去质数个数,最后对于(f(2))特殊处理加一个(2)

    CODE

    #include <bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N = 200005;
    const int mod = 1e9 + 7;
    const int inv2 = 5e8 + 4;
    int n, sqr, m, a[N], f[N], s[2][N];
    inline int ID(int x) { return x <= sqr ? x : m-n/x+1; }
    signed main () {
    	scanf("%lld", &n), sqr = sqrt(n), m = 0;
    	for(int i = 1; i <= n; ++i)
    		a[++m] = i = n/(n/i),
    		s[0][m] = (i-1) % mod,
    		s[1][m] = ((i%mod) * ((i+1)%mod) % mod * inv2 % mod - 1) % mod;
    	for(int i = 2; i <= sqr; ++i) if(s[0][i] > s[0][i-1])
    		for(int j = m; a[j] >= i*i; --j)
    			(s[0][j] -= s[0][ID(a[j]/i)]-s[0][i-1]) %= mod,
    			(s[1][j] -= i*(s[1][ID(a[j]/i)]-s[1][i-1])) %= mod;
    	for(int i = 2; i <= m; ++i) f[i] = (s[1][i]-s[0][i]+2) % mod; //加一个2
    	for(int i = sqr; i > 1; --i) if(s[0][i] > s[0][i-1])
    		for(int j = m; a[j] >= i*i; --j)
    			for(int k = 1, pw = i, sp = (s[1][i]-s[0][i]+2)%mod; pw*i <= a[j]; ++k, pw *= i)
    				(f[j] += (i^k)*(f[ID(a[j]/pw)]-sp)+(i^(k+1))) %= mod;
    	printf("%lld
    ", (f[m]+1+mod)%mod);
    }
    
    
  • 相关阅读:
    gojs常用API-画布定义
    页面开发的标准
    iis7.5做反向代理配置方法实例图文教程
    Tomcat实现反向代理
    nodejs的package.json依赖dependencies中 ^ 和 ~ 的区别
    dependencies与devDependencies的区别
    常见的cmd命令
    解决SecureCRT中文显示乱码
    ASP防XSS代码
    Android页面之间进行数据回传
  • 原文地址:https://www.cnblogs.com/Orz-IE/p/12195154.html
Copyright © 2011-2022 走看看