Description###

小Q是个程序员。

作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理。

每当小Q不知道如何解决时,就只好向你求助。为了完成任务,小Q需要列一个表格,表格

有无穷多行,无穷多列,行和列都从1开始标号。为了完成任务,表格里面每个格子都填了

一个整数,为了方便描述,小Q把第a行第b列的整数记为f(a,b),为了完成任务,这个表格要

满足一些条件:

(1)对任意的正整数a,b,都要满足f(a,b)=f(b,a);

(2)对任意的正整数a,b,都要

满足b×f(a,a+b)=(a+b)*f(a,b)。为了完成任务,一开始表格里面的数很有规律,第a行第b列的

数恰好等于a*b,显然一开始是满足上述两个条件的。为了完成任务,小Q需要不断的修改表

格里面的数,每当修改了一个格子的数之后,为了让表格继续满足上述两个条件,小Q还需要

把这次修改能够波及到的全部格子里都改为恰当的数。由于某种神奇的力量驱使,已经确保了

每一轮修改之后所有格子里的数仍然都是整数。为了完成任务,小Q还需要随时获取前k行前k

列这个有限区域内所有数的和是多少,答案可能比较大,只需要算出答案mod1,000,000,007

之后的结果。

Input###

第1行包含两个整数m,n,表示共有m次操作,所有操作和查询涉及到的行编号和列编号都不超过n。

接下来m行,每行4个整数a,b,x,k表示把第a行b列的数改成x,然后把它能够波及到的所有格子全

部修改,保证修改之后所有格子的数仍然都是整数,修改完成后计算前k行前k列里所有数的和。

1<=m<=10000,1<=a,b,k<=N<=4*106,0<=x<=1018

Output###

输出共m行,每次操作之后输出1行,表示答案mod 1,000,000,007之后的结果。

Sample Input###

3 3

1 1 1 2

2 2 4 3

1 2 4 2

Sample Output###

9

36

14

一开始,表格的前3行前3列如图中左边所示,前2次操

作后表格没有变化,第3次操作之后的表格如右边所示。

1 2 3 2 4 6

2 4 6 4 4 12

3 6 9 6 12 9


简要题解##

观察表格,可发现

\[\begin{equation*}
f(a,b)=f(gcd(a,b),gcd(a,b)) \cdot \frac{a}{gcd(a,b)} \cdot \frac{b}{gcd(a,b)}
\end{equation*}
\]

于是我们只需记下\(f(i,i)\)的值即可

利用欧拉函数计算答案,分块维护


想法##

手动模拟表格,至少花了30分钟我才发现

\[\begin{equation*}
f(a,b)=f(gcd(a,b),gcd(a,b)) \cdot \frac{a}{gcd(a,b)} \cdot \frac{b}{gcd(a,b)}
\end{equation*}
\]

发现结论的我大呼:妙题!

然后很尴尬地发现我不会做了…无奈只好翻题解

由上面的式子可知,我们只需记下所有\(f(i,i)\),其他所有\(f\)值就都可以求出来了

查询时

\[\begin{equation*}
ans=\sum\limits_{i=1}^k f(i,i) \cdot [\sum\limits_{x=1}^{k/i} \sum\limits_{y=1}^{k/i} xy \cdot (gcd(x,y)==1)]
\end{equation*}
\]

我们记

\[\begin{equation*}
\begin{aligned}
g(n)&=\sum\limits_{x=1}^n \sum\limits_{y=1}^n xy \cdot (gcd(x,y)==1)\\
&=2\sum\limits_{x=1}^n \sum\limits_{y=1}^x xy \cdot (gcd(x,y)==1) - \sum\limits_{x=1}^n x^2 \cdot (gcd(x,x)==1) \\
&=2\sum\limits_{x=1}^n \sum\limits_{y=1}^x xy \cdot (gcd(x,y)==1) - 1
\end{aligned}
\end{equation*}
\]

再记

\[\begin{equation*}
\begin{aligned}
h(n) &=\sum\limits_{y=1}^n ny \cdot (gcd(n,y)==1) \\
&=n \sum\limits_{y=1}^n y \cdot (gcd(n,y)==1) \\
\end{aligned}
\end{equation*}
\]

这个式子可以理解为,1~n中所有与n互质的数的和 × n

有欧拉函数 \(\varphi(n)\) 表示n以内与n互质的数的个数

我们知道,若x与n互质,则n-x也与n互质。

也就是说与n互质的数可两两配对,和为n。

那么

\[\begin{equation*}
h(n)=\frac{\varphi(n) \cdot n^2}{2}
\end{equation*}
\]

\[\begin{equation*}
g(n)=2 \sum\limits_{x=1}^n h(x) - 1
\end{equation*}
\]

那么

\[\begin{equation*}
ans=\sum\limits_{i=1}^k f(i,i) \cdot g(k/i)
\end{equation*}
\]

由于我们知道 \(k/i\) 只有 \(\sqrt{n}\) 种取值

于是就可以愉快地分块 \(f(i,i)\) 啦!

设计一个 \(O(\sqrt{n})\) 修改, \(O(1)\) 查询的分块结构就好了……


代码##

注:调了若干次才终于对…心好累

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath> #define P 1000000007 using namespace std; typedef long long ll;
const int N = 4000005;
const int SN = 4005; ll phi[N];
int prime[N],pnum;
int n,sn,block;
void getphi(){
phi[1]=1;
for(int i=2;i<=n;i++) phi[i]=i-1;
for(int i=2;i<=n;i++){
if(phi[i]==i-1) prime[pnum++]=i;
for(int j=0;j<pnum && (ll)prime[j]*i<=n;j++){
if(i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
phi[i]=(phi[i-1]+(ll)i*i%P*phi[i])%P; //g(i)
}
} ll num[N],add[SN];
ll query(int x){
if(!x) return 0;
int bl=(x-1)/sn+1;
return (num[x]+add[bl])%P;
}
void change(int x,ll c){
int bl=(x-1)/sn+1;
for(int i=x;i<=min(bl*sn,n);i++) num[i]=(num[i]+c)%P;
for(int i=bl+1;i<=block;i++) add[i]=(add[i]+c)%P;
}
int gcd(int a,int b) { return b ? gcd(b,a%b) : a; } int main()
{
int m;
scanf("%d%d",&m,&n);
sn=(int)sqrt(n); block=(n-1)/sn+1;
for(int i=1;i<=n;i++) num[i]=(num[i-1]+(ll)i*i%P)%P;
getphi(); int a,b,k,g;
ll ans=0,x,X;
while(m--){
scanf("%d%d%lld%d",&a,&b,&x,&k);
if(a<b) swap(a,b);
g=gcd(a,b);
X=(x/(1ll((ll)a/g)*(b/g)))%P; //罪魁祸首!!就是这里!!!
change(g,(X-(query(g)-query(g-1)+P)%P+P)%P);
ans=0;
for(int l=1,r;l<=k;l=r+1){
r=k/(k/l);
ans=(ans+(query(r)-query(l-1)+P)%P*phi[k/l]%P)%P;
}
printf("%lld\n",ans);
} return 0;
}

[bzoj4815] [洛谷P3700] [Cqoi2017] 小Q的表格的更多相关文章

  1. 洛谷 P3700 - [CQOI2017]小Q的表格(找性质+数论)

    洛谷题面传送门 又是一道需要一些观察的数论 hot tea-- 注意到题目中 \(b·f(a,a+b)=(a+b)·f(a,b)\) 这个柿子长得有点像求解 \(\gcd\) 的辗转相除法,因此考虑从 ...

  2. 洛咕 P3700 [CQOI2017]小Q的表格

    洛咕 P3700 [CQOI2017]小Q的表格 神仙题orz 首先推一下给的两个式子中的第二个 \(b\cdot F(a,a+b)=(a+b)\cdot F(a,b)\) 先简单的想,\(F(a,a ...

  3. 洛谷 P3698 [CQOI2017]小Q的棋盘 解题报告

    P3698 [CQOI2017]小Q的棋盘 题目描述 小 Q 正在设计一种棋类游戏. 在小 Q 设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上 ...

  4. BZOJ4813或洛谷3698 [CQOI2017]小Q的棋盘

    BZOJ原题链接 洛谷原题链接 贪心或树形\(DP\)都可做,但显然\(DP\)式子不好推(因为我太菜了),所以我选择贪心. 很显然从根出发主干走最长链是最优的,而剩下的点每个都需要走两步,所以用除去 ...

  5. 洛谷P3698 [CQOI2017]小Q的棋盘

    传送门 考虑一个贪心,先在根节点周围转一圈,然后再往下走最长链肯定是最优的 然后设最长链的长度为$d$,如果$m\leq d$,那么答案为$m+1$ 否则的话还剩下$m-d+1$步,又得保证能走回来, ...

  6. 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)

    [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...

  7. [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)

    4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 832  Solved: 342[Submit][Statu ...

  8. bzoj 4815: [Cqoi2017]小Q的表格 [数论]

    4815: [Cqoi2017]小Q的表格 题意: 单点修改,查询前缀正方形和.修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b) 一开始sb了认为一次只会 ...

  9. [bzoj4815]: [Cqoi2017]小Q的表格

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. ...

随机推荐

  1. 应用九:Vue之国际化(vue-i18n)

    vue-i18n是一款针对Vue.js 的国际化插件,具体应用步骤如下: 一.安装插件 npm install vue-i18n --save 二.在main.js中引入插件 import VueI1 ...

  2. 1134 最长上升子序列 (序列型 DP)

    思路: 由于一般的动态规划时间复杂度是O(n^2)(哈哈哈哈 第一次用的就是这个!)用在这里由于n最大为50000 所以会超时 到这里我们可以用一个数组来动态维护这个最长上升的子序列,将你要输入的子序 ...

  3. JS与JSP分别是什么

    JS:JavaScript: JSP:Java Server Pages. jsp:只是servlet的一个变种,方便书写html内容才出现的,servlet是根本,所有jsp能做的,servlet全 ...

  4. CodeForce - 1189 D1. Add on a Tree (思维题)

    Note that this is the first problem of the two similar problems. You can hack this problem only if y ...

  5. Checkpoint 防火墙修改网卡buffer

    近期有一台CP5100频繁丢包,修改网卡buffer步骤如下,默认的网卡buffer为256,最大可以修改为4096,其步骤如下: step1:ssh登录checkpoint 防火墙控制台 step2 ...

  6. Visual Studio Team Services and Team Foundation Server官方资料入口

    Team Foundation Server msdn 中文文档入口 Visual Studio Team Services or Team Foundation Server www.visuals ...

  7. CSDN博客 专用备份工具

    CSDN博客 专用备份工具 用要的朋友可下载. 本程序为个人所用,仅供学习.作者:潇湘博客网站:http://blog.csdn.NET/fkedwgwy默认文件存放位置为用户名文件夹下,也可以直接自 ...

  8. HBase写过程详解

    1首次读写流程图 2 首次写基本流程 (1)客户端发起PUT请求,Zookeeper返回hbase:meta所在的region server (2)去(1)返回的server上,根据rowkey去hb ...

  9. Spring Boot 嵌入式Web容器

    目录 前言 1.起源 2.容器启动流程解析 2.1.获取应用类型 2.2.容器启动流程 3.加载 Web 容器工厂 4.总结 前言         最近在学习Spring Boot相关的课程,过程中以 ...

  10. 基于MIG IP核的DDR3控制器(二)

    上一节中,记录到了ddr控制器的整体架构,在本节中,准备把ddr控制器的各个模块完善一下. 可以看到上一节中介绍了DDR控制器的整体架构,因为这几周事情多,又要课设什么的麻烦,今天抽点时间把这个记录完 ...