题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815

题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目。

然后大家都知道$(a,b)=(a,a-b)=(a,a+b)$,于是观察(猜)一下这个表格与gcd的关系。

可以发现每次修改$(a,b)$会影响到所有$(i,j)=(a,b)$的点,并且关系为$$f(i,j)=\frac{i}{a}*\frac{j}{b}*f(a,b)$$

所以只需要知道$f(d,d)$的值记为$f(d)$,就能推出其他的值。

然后慢慢推推推大概可以推到这一步$$ans=\sum_{d=1}^nf(d)\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}(i,j)[(i,j)==1]$$

可以发现这个式子中$i$和$j$是对称的$$S(\frac{n}{d})=\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}(i,j)[(i,j)==1]$$

不妨先设$i>j$,于是我们有$$S′(n)=\sum_{i=1}^n\frac{φ(i)*i^{2}}{2}$$

由于$i$与$j$对称,所以有$$S(n)=2*S′(n)=\sum_{i=1}^nφ(i)*i^{2}$$

所以最终的答案就变成了$$ans=\sum_{d=1}^nf(d)S(\frac{n}{d})$$

我们记录$f$的前缀和,并且分块维护这个数列,而$S$很明显是可以预处理出来的。

询问了$m$次,于是总体复杂度应该是$O(m\sqrt{n})$

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 typedef long long ll;
 7 const int mod=1e9+7;
 8 int inline readint(){
 9     int Num;char ch;
10     while((ch=getchar())<'0'||ch>'9');Num=ch-'0';
11     while((ch=getchar())>='0'&&ch<='9') Num=Num*10+ch-'0';
12     return Num;
13 }
14 ll inline readll(){
15     ll Num;char ch;
16     while((ch=getchar())<'0'||ch>'9');Num=ch-'0';
17     while((ch=getchar())>='0'&&ch<='9') Num=Num*10+ch-'0';
18     return Num;
19 }
20 void outint(int x){
21     if(x>=10) outint(x/10);
22     putchar(x%10+'0');
23 }
24 int inline gcd(int x,int y){
25     return !y?x:gcd(y,x%y);
26 }
27 int n,m;
28 int phi[4000010],p[4000010],cnt=0;
29 int la,blk,add[2010];
30 int f[4000010];
31 bool vis[4000010];
32 void sieve(int n){
33     for(int i=2;i<=n;i++){
34         if(!vis[i]){
35             p[++cnt]=i;
36             phi[i]=i-1;
37         }
38         for(int j=1;p[j]*i<=n;j++){
39             vis[p[j]*i]=true;
40             if(i%p[j]==0){
41                 phi[p[j]*i]=phi[i]*p[j];
42                 break;
43             }
44             phi[p[j]*i]=phi[i]*(p[j]-1);
45         }
46         phi[i]=(1LL*i*i%mod*phi[i]+phi[i-1])%mod;
47         f[i]=(1LL*i*i+f[i-1])%mod;
48     }
49 }
50 void modify(int x,int ad){
51     int l=(x-1)/blk+1,
52         r=min(n,l*blk);
53     for(int i=l+1;i<=la;i++) add[i]=(add[i]+ad)%mod;
54     for(int i=x;i<=r;i++) f[i]=(f[i]+ad)%mod;
55 }
56 int inline qry(int x){
57     return x?(f[x]+add[(x-1)/blk+1])%mod:0;
58 }
59 int main(){
60     m=readint();
61     n=readint();
62     f[1]=phi[1]=1;
63     blk=(int)sqrt(n);
64     la=(n-1)/blk+1;
65     sieve(n);
66     for(int i=1;i<=m;i++){
67         int a=readint(),
68             b=readint(),
69             g=gcd(a,b),
70             ans=0;
71         ll x=readll();
72         int k=readint();
73         x=x/(1LL*(a/g)*(b/g))%mod;
74         modify(g,((x-qry(g)+qry(g-1))%mod+mod)%mod);
75         for(int j=1,now;j<=k;j=now+1){
76             now=k/(k/j);
77             ans=(ans+1LL*(qry(now)-qry(j-1)+mod)%mod*phi[k/j])%mod;
78         }
79         outint(ans);
80         putchar('\n');
81     }
82     return 0;
83 }

转载于:https://www.cnblogs.com/halfrot/p/7413812.html

[BZOJ4815][CQOI2017]小Q的表格 数论+分块相关推荐

  1. [CQOI2017]小Q的表格(数论+分块)

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

  2. [CQOI2017] 小Q的表格(分块 + 整除分块 + 数学 + 前缀和)

    problem luogu-P3700 solution f(a,b)=f(b,a)f(a,b)=f(b,a)f(a,b)=f(b,a) 意味着我们只用考虑半个棋盘的信息. b∗f(a,a+b)=(a ...

  3. P3700 [CQOI2017]小Q的表格(反演、分块)

    P3700 [CQOI2017]小Q的表格 给定一个大小为n×nn \times nn×n的表格,初始时i,ji, ji,j位置上填的是f(i,j)=i×jf(i, j) = i \times jf( ...

  4. P3700-[CQOI2017]小Q的表格【分块,欧拉函数】

    正题 题目链接:https://www.luogu.com.cn/problem/P3700 题目大意 一个n∗nn*nn∗n个数的数字表格,开始位置(a,b)(a,b)(a,b)上的是a∗ba*ba ...

  5. 【CQOI2017】小Q的表格

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

  6. [bzoj4813][Cqoi2017]小Q的棋盘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V ...

  7. 【CQOI2017】bzoj4815 小Q的表格

    根据辗转相减可以知道,相互影响的就是 gcd \gcd相同的那些数.又根据条件 2 2可以知道,所有gcd\gcd相同的数的比例是不会改变的,又因为最开始 a(x,y)=xy a(x,y)=xy是一组 ...

  8. BZOJ 4814 Luogu P3699 [CQOI2017]小Q的草稿 (计算几何、扫描线、set)

    题目链接 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id=4814 (Luogu) https://www.luogu.org/problem/P ...

  9. bzoj 4813: [Cqoi2017]小Q的棋盘【树形dp】

    这么简单的dp我怎么没想到x2 f为从这个点出发后回到这个点最多能走过的点,g为从这个点出发后不回到这个点最多能走过的点,注意g有两种转移:g[u][k]=max(g[u][k],f[u][k-j-1 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 P0101
  2. 转:MFC中常用类,宏,函数介绍
  3. Getting Started With setuptools and setup.py
  4. 网络爬虫中Fiddler抓取PC端网页数据包与手机端APP数据包
  5. UI层调用WCF服务实例(源码)
  6. 树莓派4上跑 .NET Core 3.0,这次,真·64位!
  7. 炎炎夏日需要一个清凉的地 - 自制水冷系统(十一 指尖的思绪之程序篇)
  8. Oracle 技术集锦
  9. 【共读Primer】52.[6.3]返回类型和return语句--返回数组指针 Page205
  10. 备战数学建模10-主成分分析模型与因子分析模型
  11. IEEE邮件爆出:禁止华为员工审稿,惨遭网友吐槽!
  12. Eigen库计算两个向量夹角
  13. 定制Linux系统安装盘,syslinux定制系统启动盘
  14. 时间紧、任务重、资源有限,项目经理如何来保证研发效率?
  15. 2010提升你幽默感的语句
  16. UI设计——以网易云音乐为例
  17. SWF (Simple Workflow Service)简介
  18. macbook视频格式转换_一键视频格式转换器for Mac-一键视频格式转换器Mac版下载 V6.3.37-PC6苹果网...
  19. allegro如何删除没有网络的走线,查还没有连的网络线
  20. WPS office根目录在哪?_wps和office的区别是什么

热门文章

  1. 如何解决ipconfig、ping不是内部或外部命令
  2. 操作系统第二章-进程的描述与控制
  3. java中的static关键字总结
  4. 小程序素材抓取软件_如何抓取微信小程序的数据?
  5. 堆和栈的概念和区别 python_堆和栈的区别是啥?
  6. js 引用 java常量_java调用JS 与JS 调java
  7. mysql系统文件路径修改不了_MySQL数据库改路径后没办法启动的问题
  8. java 分布式编程,Java的并行、并发和分布式编程
  9. spring java配置_Spring基于java的配置
  10. 摆摊吗?我卖锅,你修手机。