【LOJ】#3020. 「CQOI2017」小 Q 的表格
#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 的表格的更多相关文章
- 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$次修改,每 ...
- 「NOI2013」小 Q 的修炼 解题报告
「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...
- loj#2009.「SCOI2015」小凸玩密室
题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...
- 【CQOI2017】小Q的表格
[CQOI2017]小Q的表格 稍加推导就会发现\(f(a,b)=a\cdot b\cdot h(gcd(a,b))\). 初始时\(h(n)=1\). 询问前\(k\)行\(k\)列时我们就反演: ...
- loj #2008. 「SCOI2015」小凸想跑步
#2008. 「SCOI2015」小凸想跑步 题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n nn 边形,N NN 个顶点按照逆时针从 0∼n−1 0 ...
- loj #2006. 「SCOI2015」小凸玩矩阵
#2006. 「SCOI2015」小凸玩矩阵 题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...
- @loj - 3022@ 「CQOI2017」老 C 的方块
目录 @description@ @solution@ @accepted code@ @details@ @description@ 老 C 是个程序员. 作为一个懒惰的程序员,老 C 经常在电脑上 ...
- *LOJ#2134. 「NOI2015」小园丁与老司机
$n \leq 5e4$个平面上的点,从原点出发,能从当前点向左.右.上.左上或右上到达该方向最近的给定点.问三个问:一.最多经过多少点:二.前一问的方案:三.其所有方案种非左右走的边至少要开几辆挖掘 ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
随机推荐
- 数据结构实验之二叉树一:树的同构 (SDUT 3340)
题解:把原本结构体的左右子树的类型定义成 int 型,用来存放这个结点的左右子树的编号,分别建造两棵二叉树,按个比较,如果在第二棵树中没有找到,那么就不用在判断了. #include <bits ...
- vue pc element-ui class
按需引入element-ui npm install babel-plugin-component -D 先安装这个 然后在babelrc中配置: 在plugins中加入红色框的那一部分 [ &q ...
- C# 图片进行马赛克处理
MosaicHelper.AdjustTobMosaic( @"C:\Users\xxxue\Desktop\QQ图片20180704142029.jpg", @"C:\ ...
- MQ Cannot convert from [[B] to [] for GenericMessage
MQ消费端转换报错:主要错误信息:Caused by: org.springframework.messaging.converter.MessageConversionException: Cann ...
- AHOI2012树屋阶梯
这玩意不是卡特兰的经典模型吗…… 我们设方案数为f(i),则f(0)=1,f(1)=1,f(2)=2,f(3)=5,(其实到这里你再手模一个就出来了)我们把左上角的矩形删掉,则会变成下方和右方两个更小 ...
- Arts打卡第9周
Algorithm.主要是为了编程训练和学习. 每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard). 进行编程训练,如果不训练你看再多的算法书,你依然不 ...
- Synchronized 有几种用法
我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面.其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法. 1.同步普通方法 这个也是我 ...
- [Android] i2c-toos 在 Android 上使用
CPU:RK3399 系统:Android 7.1 i2c-tools 是一款免费开源的工具,可以检测 i2c 总线上的设备,可以读写寄存器等等 可以从下面路径下载需要的版本: https://www ...
- django post 403
同一个地址GET方式可以正常访问 在POST 提交数据过程中报403错误, 原来是1.3版本settings.py 文件中 'django.middleware.csrf.CsrfViewMiddle ...
- [游戏开发]LÖVE2D(1):引擎介绍
什么是LÖVE引擎 Love引擎是一个非常棒的框架,你可以用来在Lua制作2D游戏.它是免费的,开源的,适用于Windows,Mac OS X,Linux,Android和iOS. 怎么安装 在官网下 ...