• bzoj2693:jzptab


    Pre

    神奇的线性筛。

    交的时候忘了对答案加上(mod)再%(mod)

    然后0分,才发现只有一个测试点。

    Solution

    不管前面的,式子最后是((n>m))

    (sumlimits_{T=1}^{m} (sumlimits_{i=1}^{lfloor frac{n}{T} floor} i) imes (sumlimits_{i=1}^{lfloor frac{m}{T} floor} i) imes sumlimits_{d|T} T imes mu (d) imes d)

    然后我就不会了,以为推错了。

    实际上,最后的那个

    (sumlimits_{d|T} T imes mu (d) imes d)

    可以线性筛。

    具体看代码。

    Code

    #include <bits/stdc++.h>
    #define ll long long
    #define ull unsigned long long
    #define xx first
    #define yy second
    #define mod 100000009
     
    using namespace std;
    const int N = 10000000 + 5, M = 10000000;
    bool vis[N];
    int pri[N], tot;
    ll sum[N];
    inline void init ();
    inline ll cal (ll, ll);
    
    int main () {
    	init ();
    	int t;
    	scanf ("%d", &t);
    	while (t--) {
    		int n, m;
    		scanf ("%d%d", &n, &m);
    		if (n < m) {
    			swap (n, m);
    		}
    		int l = 1, r;
    		ll res = 0;
    		while (1) {
    			if (l > m) {
    				break;
    			}
    			r = min (n / (n / l), m / (m / l));
    			res += cal (n / l, m / l) * (sum[r] - sum[l - 1]);
    			res = (res + mod) % mod;
    			l = r + 1;
    		}
    		printf ("%lld
    ", (res + mod) % mod);
    	}
        return 0;
    }
    
    inline ll cal (ll u, ll v) {
    	ll tmp = v * (v + 1) / 2 % mod;
    	ll tmp2 = u * (u + 1) / 2 % mod;
    	return tmp * tmp2 % mod;
    }
    
    inline void init () {
    	sum[1] = 1;
    	for (int i = 2; i <= M; ++i) {
    		if (!vis[i]) {
    			pri[++tot] = i;
    			sum[i] = 1 - i;
    		}
    		for (int j = 1; j <= tot; ++j) {
    			if (1LL * pri[j] * i >= M) {
    				break;
    			}
    			vis[pri[j] * i] = 1;
    			if (i % pri[j] == 0) {
    				sum[pri[j] * i] = sum[i];
    				break;
    			}
    			sum[pri[j] * i] = (sum[i] * sum[pri[j]] % mod + mod) % mod;
    		}
    	}
    	for (int i = 2; i <= M; ++i) {
    		sum[i] = sum[i] * i % mod;
    		sum[i] = (sum[i] + sum[i - 1] + mod) % mod;
    	}
    }
    

    Conclusion

    这个线性筛可谓惊天地泣鬼神,它利用了莫比乌斯函数质数与合数的神奇性质,也就是说以后可以考虑对于这种东西乱搞,看能不能用这种东西解决。

  • 相关阅读:
    发布(Windows)
    Parallel并行编程
    query通用开源框架
    深入了解三种针对文件(JSON、XML与INI)的配置源
    GitLab CI
    雅思创始人Keith Taylor谈英语学习
    查看内存使用情况
    Reverse String
    分布式消息系统jafka快速起步(转)
    深入浅出 消息队列 ActiveMQ(转)
  • 原文地址:https://www.cnblogs.com/ChiTongZ/p/11163168.html
Copyright © 2020-2023  润新知