Codeforces 585E Present for Vitalik the Philatelist (莫比乌斯反演)

来源:互联网 发布:忘仙商人软件 编辑:程序博客网 时间:2024/06/05 03:18
#include <iostream>  #include <cstdio>  #include <cstring>  #include <cmath>  #include <algorithm>  #include <queue>  #include <set>  #include <ctime>  #include <cstdlib>  using namespace std;  #define inf 0x3f3f3f3f#define N 10000020#define M 1000020#define LL long long#define mod 1000000007#define ls (i << 1)#define rs (ls | 1)#define md (ll + rr >> 1)#define lson ll, md, ls#define rson md + 1, rr, rs#define B 350int p[N/10], cnt;short int mu[N];bool np[N];int p2[N];int n;int h[N];int g[N];int c[N];int a[N];void init() {mu[1] = 1;for(int i = 2; i < N; ++i) {if(!np[i]) {p[cnt++] = i;mu[i] = -1;}for(int j = 0; j < cnt && i * p[j] < N; ++j) {int t = i * p[j];np[t] = 1;if(i % p[j] == 0) {mu[t] = 0;break;}mu[t] = mu[i] * -1;}}p2[0] = 1;for(int i = 1; i < N; ++i) p2[i] = p2[i-1] * 2 % mod;h[1] = g[1] = p2[n] - 1;a[1] = n;for(int i = 2; i < N; ++i) {for(int j = i + i; j < N; j += i) {a[i] += a[j];}if(a[i] > 0) h[i] = g[i] = p2[a[i]] - 1;}for(int j = 2; j < N; ++j) {if(mu[j] == 0) continue;for(int d = j, i = 1; d < N; d += j, ++i) {h[i] += 1LL * mu[j] * g[d] % mod;if(h[i] >= mod) h[i] -= mod;if(h[i] < 0) h[i] += mod;}}for(int i = 1; i < N; ++i) {if(mu[i] == 0) continue;for(int j = i; j < N; j += i) {c[j] += 1LL * mu[i] * a[i] % mod;if(c[j] < 0) c[j] += mod;if(c[j] >= mod) c[j] -= mod;}}}int readint() {char c;while((c = getchar()) && !(c >= '0' && c <= '9'));int ret = c - 48;while((c = getchar()) && c >= '0' && c <= '9')ret = ret * 10 + c - 48;return ret;}int main() {scanf("%d", &n);for(int i = 1; i <= n; ++i) {int x;x = readint();a[x]++;}init();LL ans = 0;for(int i = 2; i < N; ++i) {ans += 1LL * c[i] * h[i];}ans %= mod;printf("%d\n", ans);return 0;}

0 1
原创粉丝点击