[Cqoi 2017] bzoj4815 小Q的表格 [莫比乌斯反演]

原创 2018年04月15日 20:48:34

Description:
自己看题。
Solution:
这个f的形式和gcd很像,事实上每次修改(a,b)会影响到gcd(i,j)==gcd(a,b)
所以我们只用保留gcd(i,i)即可。每次修改(a,b)等价于修改gcd(a,b)
然后维护S(d),表示f(d,d)的前缀和。
那么得出答案即是
i=1kf(i)S([ki])
S(n)=i=1nϕ(i)i2

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 4e6 + 5, P = 1e9 + 7;
int n, m;
int mark[maxn], p[maxn], l[maxn], r[maxn], b[maxn];
ll phi[maxn], s[maxn], S[maxn], add[maxn], a[maxn];
int gcd(int a, int b) {
    return !b ? a : gcd(b, a % b);
}
ll power(ll x, ll t) {
    ll ret = 1;
    for(; t; t >>= 1, x = x * x % P) {
        if(t & 1) {
            ret = ret * x % P;
        }
    }
    return ret;
}
void ini() {
    phi[1] = 1;
    for(int i = 2; i < maxn; ++i) {
        if(!mark[i]) {
            p[++p[0]] = i;
            phi[i] = i - 1;
        }
        for(int j = 1; j <= p[0] && i * p[j] < maxn; ++j) {
            mark[i * p[j]] = 1;
            if(i % p[j] == 0) {
                phi[i * p[j]] = phi[i] * p[j];
                break;
            }
            phi[i * p[j]] = phi[i] * phi[p[j]];
        }
    }
    for(int i = 1; i < maxn; ++i) {
        s[i] = (s[i - 1] + phi[i] * i % P * i % P) % P;
    }
}
int main() {
    ini();
    scanf("%d%d", &m, &n);
    int B = sqrt(n);
    for(int i = 1; i <= n; ++i) {
        S[i] = (S[i - 1] + (long long) i * i % P) % P;
        a[i] = (long long) i * i % P;
        b[i] = (i - 1) / B + 1;
        if(!l[b[i]]) {
            l[b[i]] = i;
        }
        r[b[i]] = i;
    }
    while(m--) {
        int A, B, k;
        ll x, ans = 0;
        scanf("%d%d%lld%d", &A, &B, &x, &k);
        int d = gcd(A, B);
        x %= P;
        x = x * d % P * d % P * power((long long) A * B % P, P - 2) % P;
        for(int i = d; i <= r[b[d]]; ++i) {
            S[i] = (S[i] + x - a[d] + P) % P;
        }
        for(int i = b[d] + 1; i <= b[n]; ++i) {
            add[i] = (add[i] + x - a[d] + P) % P;
        }
        a[d] = x;
        for(int i = 1, j; i <= k; i = j + 1) {
            j = k / (k / i);
            ans = (ans + (S[j] + add[b[j]] - S[i - 1] - add[b[i - 1]] + 2 * P) % P * s[k / i] % P) % P;
        }
        printf("%lld\n", ans);
    }       
    return 0;
}

DOM4J 使用简介

Dom4j 使用简介 作者:冰云 icecloud(AT)sina.com 时间:
  • icecloud
  • icecloud
  • 2003-12-17 23:58:00
  • 9230

bzoj 4815: [Cqoi2017]小Q的表格

落魄之人看清自己
  • qq_20669971
  • qq_20669971
  • 2017-04-14 16:40:10
  • 876

【CQOI2017】bzoj4815 小Q的表格

辗转相减+莫比乌斯反演+分块
  • sdfzyhx
  • sdfzyhx
  • 2017-04-13 10:22:56
  • 874

bzoj4815 [Cqoi2017]小Q的表格

【题意】 一个n*n的表格map[n][n],初始map[a][b]=a*b 表格始终满足2个条件: 1.map[a][b]=map[b][a](1 2.b*map[a][a+b]=(a+b)*map...
  • leolyun
  • leolyun
  • 2017-04-12 20:19:32
  • 1972

BZOJ4815: [Cqoi2017]小Q的表格

BZOJ4815b×f(a,a+b)=(a+b)∗f(a,b)b×f(a,a+b)=(a+b)*f(a,b)很像辗转相减法。。 那么每次修改点(a,b)(a,b)的值,会修改所有满足gcd(i,j)...
  • Ep1C_HeReT1c
  • Ep1C_HeReT1c
  • 2017-06-08 15:25:04
  • 345

[分块 莫比乌斯反演] BZOJ 4815 [Cqoi2017]小Q的表格

那个神奇的关系式 其实是辗转相减的形式 稍微发现下就能知道 这其实是个一维的东西 fa,b=abgcd2(a,b)∗fgcd(a,b),gcd(a,b)f_{a,b}={ab\over gcd^2...
  • u014609452
  • u014609452
  • 2017-04-21 08:20:27
  • 387

bzoj 4815: [Cqoi2017]小Q的表格 分块+莫比乌斯反演

题意小Q是个程序员。 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理。每当小Q不知道如何解决时,就只好向你求助。为了完成任务,小Q需要列一个表格,表格有无穷多行,无...
  • qq_33229466
  • qq_33229466
  • 2017-04-14 17:00:00
  • 855

【数论】[CQOI2017]小 Q 的表格

好气哦!!!题目描述输入输出输出文件 table.out。 输出共m行,每次操作之后输出1行,表示答案mod 1,000,000,007之后的结果。分析好气啊!!!好气啊!!这样一个傻逼题为什么当时...
  • outer_form
  • outer_form
  • 2017-04-11 10:33:28
  • 556

【BZOJ4815】 [Cqoi2017]小Q的表格

题意其实很简单f(a,b)=f(b,a) b*f(a,a+b)=(a+b)*f(a,b)
  • wzf_2000
  • wzf_2000
  • 2017-04-25 09:46:14
  • 138

[bzoj4815][CQOI2017]小Q的表格

题目描述小Q是个程序员。 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理。每当小Q不知道如何解决 时,就只好向你求助。为了完成任务,小Q需要列一个表格,表格有无穷...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017-06-16 17:12:32
  • 388
收藏助手
不良信息举报
您举报文章:[Cqoi 2017] bzoj4815 小Q的表格 [莫比乌斯反演]
举报原因:
原因补充:

(最多只允许输入30个字)