您的位置:首页 > 其它

BZOJ2154 Crash的数字表格

2015-02-14 21:25 148 查看
昨天看了iwtwiioi的推导感觉很神!

今天想写结果又忘了怎么推的啦。。。233

/**************************************************************
Problem: 2154
User: rausen
Language: C++
Result: Accepted
Time:5124 ms
Memory:127760 kb
****************************************************************/

#include <cstdio>
#include <algorithm>

using namespace std;
typedef long long ll;

const int N = 1e7 + 5;
const ll mod = 20101009;

int n, m;
int p
, cnt;
bool vis
;
ll g
;

void get_g(int N) {
int i, j, k;
g[1] = 1;
for (i = 2; i <= N; ++i) {
if (!vis[i]) p[++cnt] = i, g[i] = 1 - i;
for (j = 1; j <= cnt; ++j) {
if ((k = i * p[j]) > N) break;
vis[k] = 1;
if (i % p[j] == 0) {
g[k] = g[i];
break;
}
g[k] = g[i] * (1 - p[j]);
}
}
for (i = 2; i <= N; ++i) g[i] *= i;
for (i = 1; i <= N; ++i)
(g[i] += g[i - 1]) %= mod;
}

ll calc(int n, int m) {
int i, j;
ll t1, t2, res = 0;
for (i = 1, j = 0; i <= n; i = j + 1) {
j = min(n / (n / i), m / (m / i));
t1 = (1ll * (n / i) * (n / i + 1) / 2) % mod;
t2 = (1ll * (m / i) * (m / i + 1) / 2) % mod;
(res += ((g[j] - g[i - 1]) * ((t1 * t2) % mod)) % mod) %= mod;
}
return (res % mod + mod) % mod;
}

int main() {
int i, T;
scanf("%d%d", &n, &m);
if (n > m) swap(n, m);
get_g(m);
printf("%lld\n", calc(n, m));
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: