#3020. 「CQOI2017」小 Q 的表格

这个的话求出来\(g = gcd(a,b)\)

会修改所有gcd为g的位置

我们要求\((g,g)\)这个位置的数一定是\(g^{2}\)的倍数

之后的\(gcd(a,b) == g\)的位置也会满足

$\frac{f(g,g)}{g^{2}} = \frac{f(a,b)}{ab} $

注意\(\frac{f(g,g)}{g^{2}}\),\(\frac{f(a,b)}{ab}\)都不一定是整数,但是\(f(g,g)\)和\(f(a,b)\)是

这样的话我们求出\(f(g,g)\)的值,很容易得到

\(ans = \sum_{d = 1}^{k} f(d,d) \sum_{i = 1}^{\lfloor \frac{k}{d} \rfloor} \sum_{j = 1}^{\lfloor \frac{k}{d} \rfloor} [gcd(i,j) == 1] i \cdot j\)

这个时候不要用\(\mu\) !不要用\(\mu\)!不要用\(\mu\)!

我们这么考虑,就是枚举一个\(i\),然后乘上\(i\)以内和\(i\)互质的数的和,由于顺序可以交换,所以要乘上1

\(i\)以内和\(i\)互质的数的公式是\(\frac{i\times \varphi(i)}{2}\)

\(1\)的话除外,不过由于外面乘了一个2,所以这个式子在这里对1成立

所以

\(ans = \sum_{d = 1}^{k} f(d,d) \sum_{i = 1}^{\lfloor \frac{k}{d} \rfloor} i^{2}\varphi(i)\)

后面的可以预处理,前面的话要更新前缀和,用分块实现\(O(\sqrt{N})\)维护和\(O(1)\)查询即可

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define ba 47
#define MAXN 4000005
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1000000007;
int M,N;
int f[MAXN],prime[MAXN],tot,phi[MAXN];
int h[MAXN],bl[2005],br[2005],id[MAXN],cnt,lz[2005];
int sum[MAXN];
bool nonprime[MAXN];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
void update(int &x,int y) {
x = inc(x,y);
}
int gcd(int a,int b) {
return b == 0 ? a : gcd(b,a % b);
}
int main(){
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
read(M);read(N);
phi[1] = 1;
h[1] = 1;
for(int i = 2 ; i <= N ; ++i) {
if(!nonprime[i]) {
prime[++tot] = i;
phi[i] = i - 1;
}
for(int j = 1 ; j <= tot ; ++j) {
if(prime[j] > N / i) break;
nonprime[i * prime[j]] = 1;
if(i % prime[j] == 0) {
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else {
phi[i * prime[j]] = phi[i] * phi[prime[j]];
}
}
h[i] = mul(phi[i],mul(i,i));
update(h[i],h[i - 1]);
}
for(int i = 1 ; i <= N ; ++i) {
sum[i] = mul(i,i);
f[i] = mul(i,i);
update(sum[i],sum[i - 1]);
}
int S = sqrt(N);
for(int i = 1 ; i <= N ; ++i) {
int r = min(N,i + S - 1);
++cnt;
bl[cnt] = i;br[cnt] = r;i = r;
for(int j = bl[cnt] ; j <= br[cnt] ; ++j) id[j] = cnt;
}
int a,b,k;
int64 x;
for(int i = 1 ; i <= M ; ++i) {
read(a);read(b);read(x);read(k);
int g = gcd(a,b);
int d = (x / (1LL * a / g * b / g)) % MOD;
int c = inc(d,MOD - f[g]);
f[g] = d;
for(int j = g ; j <= br[id[g]] ; ++j) {
update(sum[j],c); }
for(int j = id[g] + 1 ; j <= cnt ; ++j) update(lz[j],c);
int res = 0;
for(int j = 1 ; j <= k ; ++j) {
int r = k / (k / j);
int s = inc(sum[r],lz[id[r]]);
s = inc(s,MOD - inc(sum[j - 1],lz[id[j - 1]]));
update(res,mul(s,h[k / j]));
j = r;
}
out(res);enter;
}
return 0;
}

【LOJ】#3020. 「CQOI2017」小 Q 的表格的更多相关文章

  1. Luogu P3700「CQOI2017」小Q的表格

    为什么我连分块都想不到啊... 题意 定义一个矩阵$f$满足 $ f(a,b)=f(b,a)$ $ b·f(a,a+b)=(a+b)·f(a,b)$ 初始$ f(a,b)=ab$ 有$ m$次修改,每 ...

  2. 「NOI2013」小 Q 的修炼 解题报告

    「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...

  3. loj#2009.「SCOI2015」小凸玩密室

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

  4. 【CQOI2017】小Q的表格

    [CQOI2017]小Q的表格 稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\). 初始时\(h(n)=1\). 询问前\(k\)行\(k\)列时我们就反演: ...

  5. loj #2008. 「SCOI2015」小凸想跑步

    #2008. 「SCOI2015」小凸想跑步   题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...

  6. loj #2006. 「SCOI2015」小凸玩矩阵

    #2006. 「SCOI2015」小凸玩矩阵   题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...

  7. @loj - 3022@ 「CQOI2017」老 C 的方块

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 老 C 是个程序员. 作为一个懒惰的程序员,老 C 经常在电脑上 ...

  8. *LOJ#2134. 「NOI2015」小园丁与老司机

    $n \leq 5e4$个平面上的点,从原点出发,能从当前点向左.右.上.左上或右上到达该方向最近的给定点.问三个问:一.最多经过多少点:二.前一问的方案:三.其所有方案种非左右走的边至少要开几辆挖掘 ...

  9. Loj #3056. 「HNOI2019」多边形

    Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...

随机推荐

  1. checkbox后台传个list显示和回显的页面代码C标签

        <c:forEach items="${listtest}" var="provinces">        <input type= ...

  2. jquery 性能优化高级技巧

    有时为了书写方便,忽视了程序执行中给客户端带来的压力.导致在低端浏览器的运行缓慢. 1>通过CDN引用jquery,能减少网站加载时间.http://apps.bdimg.com/libs/jq ...

  3. GCC与GDB使用

    GCC基本命令 gcc[选项][文件名] -E:仅执行编译预处理(.c->.i) -S:将c代码转换成汇编代码(.i->.s) -c:仅执行编译操作,不进行连接操作(.s->.o) ...

  4. Java项目开发

    项目开发整体构建: MVC+DAO设计模式 用面向对象的方式理解和使用数据库,一个数据库对应一个java项目 数据库--项目 表--类 字段--属性 表中的一条数据--类的一个对象 M:模型层 Jav ...

  5. 使用Qt Creator作为Linux IDE,代替Vim:实现两台Linux电脑远程部署和gdb调试(一台电脑有桌面系统,一台电脑无桌面系统)

      版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/libaineu2004/article/details/62423830 尊重作者,支持原创,如 ...

  6. 咏南中间件新增MORMOT插件功能

    咏南中间件新增MORMOT插件功能 咏南中间件支持DATASNAP和MORMOT两种通讯框架. 原来已经支持DATASNAP插件,现在又增加了MORMOT插件,已经支持DATASNAP和MORMOT两 ...

  7. Linux中工作目录切换命令

    1.pwd命令用于显示当前的工作目录 2.cd命令用于切换工作路径,格式为:cd [目录名称] 参数 作用 - 切换到上一次的 目录,如:cd - ~ 切换到”家目录“,如:cd ~ ~usernam ...

  8. css让文字竖着排列 writing-mode 属性

    writing-mode 属性 writing-mode 属性定义了文本在水平或垂直方向上如何排布. 语法格式如下: writing-mode: horizontal-tb | vertical-rl ...

  9. 【Oracle/Java】批量删除16张十万数据的表 单线程耗时45秒 多线程耗时38秒

    昨天做了插入的单线程多线程比较,今天做个删除的. 单线程批量删除类代码: package com.hy.delete.singlethread; import java.sql.Connection; ...

  10. OpenJudge计算概论-最高的分数

    /*======================================================== 最高的分数 总时间限制: 1000ms 内存限制: 65536kB 描述 孙老师 ...