给定正整数n,m。求
![技术分享](http://www.lydsy.com/JudgeOnline/upload/201405/aaa.jpg)
标签:limit print put 技术 jpg its href ems ret
数据规模:
1<=n,m<=500000,共有3组数据。
挖坑
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1000010, mod = 1000000007; int n, m; ll ans; ll mu[N], a[N], sum[N]; int p[N], mark[N]; ll power(ll x, ll t) { ll ret = 1; for(; t; t >>= 1, x = x * x % mod) if(t & 1) ret = ret * x % mod; return ret; } void Init() { mu[1] = 1; for(int i = 2; i <= 1000000; ++i) { if(!mark[i]) { p[++p[0]] = i; mu[i] = -1; } for(int j = 1; j <= p[0] && p[j] * i <= 1000000; ++j) { mark[i * p[j]] = 1; if(i % p[j] == 0) { mu[i * p[j]] = 0; break; } mu[i * p[j]] = -mu[i]; } } } int main() { Init(); scanf("%d%d", &n, &m); if(n > m) swap(n, m); for(int i = 1; i <= m; ++i) a[i] = 1; for(int d = 1; d <= n; ++d) { ll delta = 0; for(int p = 1; p * d <= m; ++p) { a[p] = a[p] * (ll)p % mod; sum[p] = (sum[p - 1] + a[p]) % mod; } for(int p = 1; p * d <= n; ++p) if(mu[p]) delta = (delta + mu[p] * a[p] % mod * a[p] % mod * sum[n / d / p] % mod * sum[m / d / p] % mod) % mod; ans = (ans + delta * power(d, d) % mod) % mod; } printf("%lld\n", ans); return 0; }
标签:limit print put 技术 jpg its href ems ret
原文地址:http://www.cnblogs.com/19992147orz/p/6731243.html