zoukankan      html  css  js  c++  java
  • bzoj4176 Lucas的数论

    Lucas的数论

    Time Limit: 30 Sec Memory Limit: 256 MB

    Description

    去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了。

    在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数。他现在长大了,题目也变难了。
    求如下表达式的值:

    其中 表示ij的约数个数。
    他发现答案有点大,只需要输出模1000000007的值。

    Input

    第一行一个整数n。

    Output

    一行一个整数ans,表示答案模1000000007的值。

    Sample Input

    2

    Sample Output

    8

    HINT

    对于100%的数据n <= 10^9。




    出门左转bzoj3994就好了。。。。

    
    #include<bits/stdc++.h>
    using namespace std;
    const int N = 2500000, mod = 1e9 + 7;
    long long mu[N];
    bool not_prime[N];
    int tot, n, prime[N];
    map<int, long long> f, MU;
    
    inline void prepare()
    {
    	mu[1] = 1;
    	for(int i = 2; i < N; ++i){
    		if(!not_prime[i]){
    			prime[++tot] = i; mu[i] = -1;
    		}
    		for(int j = 1; prime[j] * i < N; ++j){
    			not_prime[i * prime[j]] = true;
    			if(i % prime[j] == 0){mu[i * prime[j]] = 0; break;}
    			mu[i * prime[j]] = -mu[i];
    		}
    	}
    	for(int i = 2; i < N; ++i) mu[i] = (mod + mu[i - 1] + mu[i]) % mod;
    }
    
    inline int F(int t)
    {
    	int last; int ret = 0;
    	if(f[t]) return f[t];
    	for(int i = 1; i <= t; i = last + 1){
    		last = min(t, t / (t / i));
    		ret =  (ret + (last - i + 1) * (t / i) % mod) % mod;
    	}
    	return f[t] = ret;
    }
    
    long long Mu(long long t)
    {
    	if(t < N) return mu[t];
    	if(MU[t]) return MU[t];
    	long long ret = 1, last;
    	for(long long i = 2; i <= t; i = last + 1){
    		last = min(t, (t / (t / i)));
    		ret = (ret + mod - (last - i + 1) * Mu(t / i) % mod) % mod;
    	}
    	if(t == 0) ret = 0;
    	return MU[t] = ret;
    }
    
    inline void workk()
    {
    	long long ans = 0, last;
    	for(long long i = 1; i <= n; i = last + 1){
    		last = min((long long)n, (n / (n / i)));
    		ans = (ans + mod + (Mu(last) - Mu(i - 1)) * F(n / i) % mod * F(n / i)) % mod;
    	}
    	cout << ans;
    }
    
    int main()
    {
    	prepare();
    	scanf("%d", &n);
    	workk();
    	return 0;
    }
    
    
    心如花木,向阳而生。
  • 相关阅读:
    应用Solaris11放置光盘修复solaris引导妨碍
    HP 3803TX 装置debian4 Linux
    释放linux细碎的内存
    linux批量查找文件内容
    Oracle 10g R2 for Solaris x86在Solaris 11上的装配
    Linux 零碎进修之shell剧本进修
    华硕易PC台式机版7月环球上市 或运转Linux
    Linux文件琐细 一分钱一分货
    linux下平安管理
    预装Windows或Ubuntu,戴尔出Mini Inspiron 8.9寸笔记本
  • 原文地址:https://www.cnblogs.com/LLppdd/p/9214416.html
Copyright © 2011-2022 走看看