bzoj 4815: [Cqoi2017]小Q的表格 [数论]
4815: [Cqoi2017]小Q的表格
题意:
单点修改,查询前缀正方形和。修改后要求满足条件f(a,b)=f(b,a), b×f(a,a+b)=(a+b)*f(a,b)
一开始sb了认为一次只会改动两三个格子想了个cdq分治做法...
一次会影响很多格子...
经过观察以及\((a,b)=(a,a-b)=(a,a+b)\)发现,每次修改影响所有\((i,j)=(a,b)\)的点对,并且关系为\(f(i,j)=\frac{i}{a}\frac{j}{b} f(a,b)\)
我们可以只记录\(f(d,d)\)的值\(f(d)\),其他值都能得到
然后套路推倒,最后得到
\]
这里用莫比乌斯反演我只会两个分块,不如直接代入phi
S(n) = \sum_{i=1}^n i \sum_{j=1}^n j [(i,j)=1] = \sum_{i=1}^n \varphi(i)*i^2
\]
维护f值可以用分块,总体复杂度\(O(n\sqrt{n})\)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 4e6+5, mo = 1e9+7, M = 3e3+5, inv2 = (mo+1)/2;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
}
bool notp[N]; int p[N/10], phi[N]; ll s[N];
void sieve(int n) {
phi[1] = 1;
for(int i=2; i<=n; i++) {
if(!notp[i]) p[++p[0]] = i, phi[i] = i-1;
for(int j=1; j <= p[0] && i*p[j] <= n; j++) {
notp[i*p[j]] = 1;
if(i%p[j] == 0) {
phi[i*p[j]] = phi[i] * p[j];
break;
}
phi[i*p[j]] = phi[i] * (p[j] - 1);
}
}
for(int i=1; i<=n; i++) s[i] = (s[i-1] + (ll) i * i %mo * phi[i] %mo) %mo;
}
int gcd(int a, int b) {return !b ? a : gcd(b, a%b);}
ll Pow(ll a, int b) {
ll ans=1;
for(; b; b>>=1, a=a*a%mo)
if(b&1) ans=ans*a%mo;
return ans;
}
int Q, n, a, b, k; ll x;
namespace B {
int f[N], add[N], a[N];
int pos[N], block, m;
struct _blo{int l, r;} b[N];
void init() {
block = sqrt(n); m = (n-1)/block+1;
for(int i=1; i<=n; i++) pos[i] = (i-1)/block+1, a[i] = (ll)i*i%mo, f[i] = (a[i] + f[i-1]) %mo;
for(int i=1; i<=m; i++) b[i].l = (i-1)*block+1, b[i].r = i*block;
}
int que(int x) { return (f[x] + add[pos[x]]) %mo; }
void cha(int x, int v) {
int d = (v - a[x] + mo) %mo, r = b[pos[x]].r; a[x] = v;
if(d==0) return;
for(int i=x; i<=r; i++) f[i] = (f[i] + d) %mo;
for(int i=pos[x]+1; i<=m; i++) add[i] = (add[i] + d) %mo;
}
} using B::cha; using B::que;
void solve(int n) {
int ans = 0, r, last = 0, now;
for(int i=1; i<=n; i=r+1, last=now) {
r = n/(n/i); now = que(r);
ans = (ans + (ll) (now - last + mo) * s[n/i] %mo) %mo;
}
printf("%d\n", (ans + mo) %mo);
}
int main() {
freopen("in", "r", stdin);
Q=read(); n=read();
sieve(n);
B::init();
for(int i=1; i<=Q; i++) {
a=read(); b=read(); scanf("%lld", &x); k=read();
x %= mo;
int d = gcd(a, b);
cha(d, (ll) d * d %mo * x %mo * Pow((ll) a * b %mo, mo-2) %mo );
solve(k);
}
}
bzoj 4815: [Cqoi2017]小Q的表格 [数论]的更多相关文章
- BZOJ 4815 CQOI2017 小Q的表格 欧拉函数+分块
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 题意概述:要认真概述的话这个题就出来了... 分析: 首先分析题目,认真研究一下修 ...
- bzoj 4815: [Cqoi2017]小Q的表格【欧拉函数+分块】
参考:http://blog.csdn.net/qq_33229466/article/details/70174227 看这个等式的形式就像高精gcd嘛-所以随便算一下就发现每次修改(a,b)影响到 ...
- bzoj 4815 [Cqoi2017]小Q的表格——反演+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 大概就是推式子的时候注意有两个边界都是 n ,考虑变成 2*... 之类的. 分块维护 ...
- BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数
把式子化简一波. 发现一个比较厉害的性质:每个点只能影响到行列下标$gcd$与它相同的点. 然后就可以计算$\sum_{g<=k}f(g,g)*\sum_{i<=k}\sum_{j< ...
- [CQOI2017]小Q的表格(数论+分块)
题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...
- [BZOJ4815][CQOI2017]小Q的表格 数论+分块
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4815 题目中所给条件中的$(a,a+b)$和$(a,b)$的关系很瞩目. 然后大家都知道$ ...
- 4815: [Cqoi2017]小Q的表格 莫比乌斯反演 分块
(Updated 2018.04.28 : 发现公式效果不好,重新处理图片)国际惯例的题面:看到这两个公式,很多人都会想到与gcd有关.没错,最终的结论就是f(a,b)=f(gcd(a,b))*(a/ ...
- [BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演)
4815: [Cqoi2017]小Q的表格 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 832 Solved: 342[Submit][Statu ...
- 【BZOJ4815】[CQOI2017]小Q的表格(莫比乌斯反演,分块)
[BZOJ4815][CQOI2017]小Q的表格(莫比乌斯反演,分块) 题面 BZOJ 洛谷 题解 神仙题啊. 首先\(f(a,b)=f(b,a)\)告诉我们矩阵只要算一半就好了. 接下来是\(b* ...
随机推荐
- kali中的webshell
webacoo -g 生成一句话 -o 输出文件 -r 不混淆代码 -t 连接模式 -u 制定URL 生成一句话 webacoo -g -o a.php 连接一句话 webacoo -t -u htt ...
- Django 用散列隐藏数据库中主键ID
最近看到了一篇讲Django性能测试和优化的文章, 文中除了提到了很多有用的优化方法, 演示程序的数据库模型写法我觉得也很值得参考, 在这单独记录下. 原文的演示代码有些问题, 我改进了下, 这里可以 ...
- Linux安装python3.5
如果你使用的是Linux发行版,例如Ubantu,那么你的系统中可能已经安装好python了.可以使用python -v来测试一下: ortonwu@ubuntu:~$ python -V Pytho ...
- 除了四大传统OA软件商,国内还有这些优秀的OA协同产品
国内OA 软件市场经过多年的发展,在产品.应用.服务方面都已相对成熟,也出现了众多优秀的OA软件品牌. 据中国软件协会2017年公布的数据显示:泛微OA.致远OA.华天动力OA.蓝凌OA的销售仍稳居O ...
- 如何动态修改网页的标题(title)?
有时候我们需要复用一个页面,但是又希望他们拥有各自的标题,这时候就需要动态的去更改页面的title了,不然所有页面都是一个标题. 这时候就会想到使用js或jQuery去实现了. 1.js方式. 首先, ...
- 数据结构与算法(1)----->排序
这一版块,把必备的数据结构和算法做一个总结!包括排序.队列.链表.二叉树.排组合,动态规划....... 总结的过程包括理论部分,练题目可以自己去leetcode/牛客网刷起来- 第一篇文章讲排序- ...
- UE4 字符串的转换
创建Fstring: FString TestHUDString = FString(TEXT("This is my test FString.")); FString,FNam ...
- Android开发之漫漫长途 XII——Fragment详解
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 性能测试资源监控工具nmon使用方法
1.简述 nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的,它能在系统运行过程中实时地捕捉系统资源的使用 ...
- dedecms 图集标签{dede:productimagelist} {dede:field name='imgurls'}&nbs
1.{dede:productimagelist}{/dede:productimagelist} 2.{dede:field name='imgurls'}{/dede:field} 这两个图集标签 ...