zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    解读tensorflow之rnn 的示例 ptb_word_lm.py
    tensorflow 的rnn的示例 ptb_word_lm.py 的完整代码
    python中decorator的用法及原理(一)
    android 6 (API 23) 及更高版本 面向 NDK 开发者的 Android 变更
    GCC选项_-Wl,-soname 及 DT_NEEDED 的解释
    一万小时天才理论
    好好说话!
    如何打造你的独立观点
    整理的艺术3
    读过的书记不住怎么办?
  • 原文地址:https://www.cnblogs.com/ChiTongZ/p/11163168.html
Copyright © 2011-2022 走看看