首页 > 其他分享 >【题解】CQOI2017 - 小 Q 的表格

【题解】CQOI2017 - 小 Q 的表格

时间:2023-12-09 17:45:31浏览次数:36  
标签:ab gcd 表格 题解 sum varphi dfrac CQOI2017 ll

【题解】CQOI2017 - 小 Q 的表格

https://www.luogu.com.cn/problem/P3700

首先考虑题面给的两个式子。由式二可以得到:

\[\dfrac{f(a,a+b)}{a(a+b)}=\dfrac{f(a,b)}{ab} \]

发现这个很像辗转相除,可得

\[\dfrac{f(a,b)}{ab}=\dfrac{f(a,a\bmod b)}{a(a\bmod b)} \]

然后由式一转换,最终可得

\[\dfrac{f(a,b)}{ab}=\dfrac{f(\gcd(a,b),\gcd(a,b))}{\gcd(a,b)^2} \]

设 \(F(d)\) 表示 \(f(d,d)\),则每次修改 \((a,b,k)\) 就会使 \(F(d)\) 变为 \(\dfrac{k\gcd(a,b)^2}{ab}\)。

再来用 \(F\) 表示答案:

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^nf(i,j)&=\sum_{k=1}^nF(k)\sum_{i=1}^n\sum_{j=1}^n\dfrac{ij}{\gcd(i,j)^2}[\gcd(i,j)=k]\\ &=\sum_{k=1}^nF(k)\sum_{i=1}^{\frac nk}\sum_{j=1}^{\frac nk}ij[\gcd(i,j)=1]\\ &=\sum_{k=1}^nF(k)\sum_{i=1}^{\frac nk}i^2\varphi(i) \end{aligned}\]

最后一步是一个结论,来证明一下:

首先有 \(\dfrac{i\varphi(i)}2 = \sum_{j=1}^{i}j[\gcd(i,j)=1]~(i\neq 1)\),因为若 \(k\) 与 \(i\) 互素那么 \(i-k\) 也与 \(i\) 互素,所以 \(i\) 以下所有与 \(i\) 互素的数的平均数为 \(\dfrac{i}2\),乘上总数 \(\varphi(i)\) 即得证。

那么上式中 \(i,j\) 没有大小关系,所以要 \(*2\),就和分母上的 \(/2\) 消掉了。

但问题是 \(i=j\) 得情况算重复了一次:

  • 若 \(i=j\neq 1\),则不会对答案产生贡献,故不用管。
  • 若 \(i=j=1\),此时正好 \(\dfrac{i\varphi(i)}2\) 其实等于 \(\dfrac{1}2\),两个一加正好对了。

所以我们就证明了这个式子。

//P3700
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 4e6 + 10;
const ll P = 1e9 + 7;
int m, n;

ll qp(ll x, ll y){
	ll ans = 1;
	while(y){
		if(y & 1){
			ans = ans * x % P;
		}
		x = x * x % P;
		y >>= 1;
	}
	return ans;
}

int pr[N], cnt, vis[N], phi[N];
ll g[N];
void euler(){
	phi[1] = 1;
	for(int i = 2; i <= n; ++ i){
		if(!vis[i]){
			pr[++cnt] = i;
			phi[i] = i-1;
		}
		for(int j = 1; j <= cnt && i * pr[j] <= n; ++ j){
			vis[i*pr[j]] = 1;
			if(i % pr[j]){
				phi[i*pr[j]] = phi[i] * phi[pr[j]];
			} else {
				phi[i*pr[j]] = phi[i] * pr[j];
				break;
			}
		}
	}
	for(int i = 1; i <= n; ++ i){
		g[i] = (ll)phi[i] * i % P * i % P;
		g[i] = (g[i] + g[i-1]) % P;
	}
}

int inb[N], bl, L[N], R[N];
ll vl[N], bv[N], fr[N];
void blc(){
	bl = sqrt(n);
	for(int i = 1; i <= n; ++ i){
		fr[i] = (ll)i * i % P;
		vl[i] = ((ll)i * i % P + vl[i-1]) % P;
		inb[i] = (i - 1) / bl + 1;
		if(inb[i] != inb[i-1]){
			R[inb[i-1]] = i-1;
			L[inb[i]] = i;
		}
	}
	R[inb[n]] = n;
}
void add(int x, ll v){
	for(int i = x; i <= R[inb[x]]; ++ i){
		vl[i] = (vl[i] + v) % P;
	}
	for(int i = inb[x]+1; i <= inb[n]; ++ i){
		bv[i] = (bv[i] + v) % P;
	}
	fr[x] = (fr[x] + v) % P;
}
ll qry(ll x){
	return (vl[x] + bv[inb[x]]) % P;
}
ll qry(ll l, ll r){
	return (qry(r) - qry(l-1) + P) % P;
}

int main(){
	scanf("%d%d", &m, &n);
	euler();
	blc();
	while(m--){
		int a, b, k;
		ll x;
		scanf("%d%d%lld%d", &a, &b, &x, &k);
		int d = __gcd(a, b);
		x = x % P * qp(a/d, P-2) % P * qp(b/d, P-2) % P;
		add(d, (x - fr[d] + P) % P);
		ll ans = 0;
		for(int l = 1, r; l <= k;){
			r = k / (k / l);
			ans = (ans + qry(l, r) * g[k/l]) % P;
			l = r + 1;
		}
		printf("%lld\n", ans);
	}
	return 0;
}

标签:ab,gcd,表格,题解,sum,varphi,dfrac,CQOI2017,ll
From: https://www.cnblogs.com/KiharaTouma/p/17891220.html

相关文章

  • CF1773J King's Puzzle 题解
    题意:思路:当$k\gen$时,一定无法构造。证明:$n$个点的无向图,每个点的度数$d∈[1,n-1]$,度数的种数一定不会超过$n-1$。当$k\len-1$时,构造方案如下:首先,选取前$k+1$个点,构造成一条链,此时链上各点的度数为$1$,$2$,$2$,$...$,$2......
  • CF1777C Quiz Master 题解
    题意:思路:由于需要维护极差,因此将$a$排序;由于相同的数对因子的种类和极差的贡献重复,因此将$a$去重。设满足条件且极差最小的方案为:$a_1$,$a_3$,$a_4$,$a_7$,$a_9$,该方案等价于区间$[1,9]$。因此,满足条件且极差最小的方案一定为一个连续的区间$[l,r......
  • JOISC2018 题解
    ContestLinkA.ConstructionofHighwayProblemLink题目大意给\(n\)个点,初始每个点有权值\(w_i\),\(n-1\)次操作连一条边\(u\getsv\),其中\(u\)与\(1\)连通,\(v\)与\(1\)不连通,求\(1\tou\)路径上权值的逆序对数,然后把路径权值推平为\(v\)的权值。数据范围......
  • CF1838C No Prime Differences 题解
    题意:思路:构造:$n$行$m$列,先填奇数行,每行填$m$个,第$2i-1$行依次填入$(i-1)\cdotm+1$,$(i-1)\cdotm+2$,$...$,$i\cdotm-1$,$i\cdotm$,剩下的依次填入偶数行即可。证明:构造完成后,对于每行,相邻两项的差值均为$1$,一定不为......
  • JOISC2019 题解
    ContestLink\(\text{ByDaiRuiChen007}\)A.ExaminationProblemLink题目大意有\(n\)个二元组\((a,b)\)和\(q\)个询问\((x,y,z)\),每个询问求满足\(a\gex\),\(b\gey\),\(a+b\gez\)的二元组个数。数据范围:\(n,q\le10^5\)。思路分析直接CDQ求三维偏序即可,注......
  • PTA-第三次机考题解
    PTA-第三次机考题解7-1玩游戏一典型的二分模版题,之前发的第十一次练习题目中对二分有详细的讲解,这道题就是二分的第二种模版,原封不动。相信认真看过的同学还是有思路的。嘿嘿!给没有看过的同学下面再讲一次二分:直接讲整数二分,浮点数二分只需要修改细节就好(直接讲两种模版,所有......
  • 动手实现基于 JSON 和 OData 两种数据模型的 Web 应用表格控件行项目的添加和删除
    文章标题描述的需求是笔者在工作和网络上经常收到的前端开发领域的咨询话题之一。Web应用的表格控件,在切换到编辑模式下之后,给用户提供了行项目的添加和删除功能。基于MVC和MVVM框架的前端控件,都离不开Model即数据模型层。笔者工作中使用最多的模型层实现技术,即JSON模型......
  • is not eligible for getting processed by all BeanPostProcessors 问题解决
    问题在做Springboot项目时遇到如下报错18.684INFOo.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:350restartedMainBean'org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration'oftype[org.apache.rocket......
  • [ABC241Ex] Card Deck Score 题解
    题目链接点击打开链接题目解法个人认为推式子很妙的生成函数题暴力套上生成函数,\(ans=[x^m]\prod\limits_{i=1}^{n}(\sum\limits_{j=1}^{b_i}(a_ix)^j)\)\(\sum\limits_{j=1}^{b_i}(a_ix)^j=\frac{1-(a_ix)^{b_i+1}}{1-a_ix}\)所以\(ans=[x^m]\prod\limits_{i=1}^{n}\frac{......
  • 【洛谷 P2670】[NOIP2015 普及组] 扫雷游戏 题解(模拟)
    [NOIP2015普及组]扫雷游戏题目背景NOIP2015普及组T2题目描述扫雷游戏是一款十分经典的单机小游戏。在行列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的......