首页 > 其他分享 >【题解】P2260 [清华集训2012]模积和(数学,整除分块)

【题解】P2260 [清华集训2012]模积和(数学,整除分块)

时间:2022-11-11 18:56:22浏览次数:88  
标签:lfloor right limits 题解 sum P2260 模积 rfloor dfrac

【题解】P2260 [清华集训2012]模积和

比较简单的一道推式子的题。(清华集训居然会出这种水题的吗)

题目链接

P2260 [清华集训2012]模积和

题意概述

\[\sum_{i=1}^{n} \sum_{j=1}^{m} (n \bmod i) \times (m \bmod j), i \neq j \]

\(\mod 19940417\) 的值

思路分析

直接容斥一下然后推式子即可,见下:

\[\begin{aligned}\sum \limits_{i=1}^n \sum \limits_{j=1}^m(n\bmod i)(m\bmod j) &=\sum \limits_{i=1}^n (n \bmod i)\sum \limits_{j=1}^m (m \bmod j)-\sum \limits_{i=1}^{\min(n,m)} (n\bmod i)(m \bmod j)\\ &=\sum \limits_{i=1}^n (n \bmod i) \sum \limits_{j=1}^m (m-\left\lfloor\dfrac{m}{j}\right\rfloor \times j)-\sum \limits_{i=1}^{\min(n,m)}(n-\left\lfloor\dfrac{n}{i}\right\rfloor\times i)(m-\left\lfloor\dfrac{m}{i}\right\rfloor\times i)\\ &=\sum \limits_{i=1}^n (n \bmod i) (\sum \limits_{j=1}^mm -\sum \limits_{j=1}^m\left\lfloor\dfrac{m}{j}\right\rfloor \times j)-\sum \limits_{i=1}^{\min(n,m)}(nm-n\left\lfloor\dfrac{m}{i}\right\rfloor\times i-m\left\lfloor\dfrac{n}{i}\right\rfloor\times i+\left\lfloor\dfrac{m}{i}\right\rfloor\left\lfloor\dfrac{n}{i}\right\rfloor\times i^2)\\ &=\sum \limits_{i=1}^n (n \bmod i)(m^2-\sum \limits_{j=1}^m\left\lfloor\dfrac{m}{j}\right\rfloor \times j)-\sum \limits_{i=1}^{\min(n,m)}nm+n\sum \limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{m}{i}\right\rfloor \times i+m\sum \limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{n}{i}\right\rfloor \times i-\sum\limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{n}{i}\right\rfloor \left\lfloor\dfrac{m}{i}\right\rfloor \times i^2\\ &=(m^2-\sum \limits_{j=1}^m\left\lfloor\dfrac{m}{j}\right\rfloor \times j)\sum \limits_{i=1}^n (n\bmod i)-\min(n,m)nm+n\sum \limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{m}{i}\right\rfloor \times i+m\sum \limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{n}{i}\right\rfloor \times i-\sum\limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{n}{i}\right\rfloor \left\lfloor\dfrac{m}{i}\right\rfloor \times i^2\\ &=(m^2-\sum \limits_{j=1}^m\left\lfloor\dfrac{m}{j}\right\rfloor \times j)(n^2-\sum \limits_{i=1}^n\left\lfloor\dfrac{n}{i}\right\rfloor\times i)-\min(n,m)nm+n\sum \limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{m}{i}\right\rfloor \times i+m\sum \limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{n}{i}\right\rfloor \times i-\sum\limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{n}{i}\right\rfloor \left\lfloor\dfrac{m}{i}\right\rfloor \times i^2\\ \end{aligned} \]

发现前四项都可以整除分块随便求。

我们考虑最后一项怎么求。

首先考虑 \(\sum\limits_{i=1}^{\min(n,m)}\left\lfloor\dfrac{n}{i}\right\rfloor \left\lfloor\dfrac{m}{i}\right\rfloor\),这实际上也可以整除分块,只不过需要二维整除分块。

其实它和一般的整除分块区别也不大,很显然,每次只需要改一下块长就好了。

具体地,每次求 \(r\) 时:

\[r=\min(\left\lfloor\dfrac{n}{\left\lfloor \dfrac{n}{l}\right\rfloor}\right\rfloor,\left\lfloor\dfrac{m}{\left\lfloor \dfrac{m}{l}\right\rfloor}\right\rfloor) \]

时间复杂度是 \(O(\sqrt \min(n,m))\)。

然后考虑 \(\sum \limits_{i=1}^{\min(n,m)} i^2\) 怎么求。

有一个结论:

\[1^2+2^2+3^2+\cdots+n^2=\dfrac{n(n+1)(2n+1)}{6} \]

所以我们就可以求出整个的式子了。

易错点

\(19940417\) 不是素数,所以请注意:

模意义下计算 \(x\) 的逆元只有当 \(\bmod\) 为素数时才能使用 \(qpow(x,mod-2)\)!!!

模意义下计算 \(x\) 的逆元只有当 \(\bmod\) 为素数时才能使用 \(qpow(x,mod-2)\)!!!

模意义下计算 \(x\) 的逆元只有当 \(\bmod\) 为素数时才能使用 \(qpow(x,mod-2)\)!!!

我是不会告诉你我在这挂了一个小时的……

所以可以使用 exgcd 预处理出来 \(2\) 和 \(6\) 的逆元,然后求解。

代码实现

//luoguP2260
#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int mod=19940417,inv2=9970209,inv6=3323403;

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int qpow(int a,int T)
{
	int ret=1;
	while(T)
	{
		if(T&1)(ret*=a)%=mod;
		(a*=a)%=mod;T>>=1;
	}
//	cout<<ret<<endl;
	return ret;
}

int work(int n,int k)
{
	int ret=0;
	for(int l=1,r;l<=n;l=r+1)
	{
		if(k/l==0)break;
		r=min(k/(k/l),n);
		(ret+=(k/l)*(l+r)%mod*(r-l+1)%mod*inv2)%=mod;
	}
	return ret;
}

int get(int n)
{
	return n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
}

int work2(int n,int k,int p)
{
	int ret=0;
	for(int l=1,r;l<=n;l=r+1)
	{
		r=min({k/(k/l),p/(p/l),n});
		(ret+=(k/l)*(p/l)%mod*(get(r)-get(l-1)+mod)%mod)%=mod;
	}
	return ret;
}

signed main()
{
	int n,m;
	n=read();m=read();
	int sumn=work(n,n),summ=work(m,m);
	int sumM=work(min(n,m),m),sumN=work(min(n,m),n);
	int ans1=(n*n%mod-sumn+mod)%mod*(m*m%mod-summ+mod)%mod;
	int ans2=(min(n,m)*n%mod*m%mod+mod)%mod;
	int ans3=n*sumM%mod;
	int ans4=m*sumN%mod;
	int ans5=work2(min(n,m),n,m);
	cout<<((((ans1-ans2+mod)%mod+ans3)%mod+ans4)%mod-ans5+mod)%mod<<"\n";
	return 0;
}

标签:lfloor,right,limits,题解,sum,P2260,模积,rfloor,dfrac
From: https://www.cnblogs.com/xrkforces/p/luogu-P2260.html

相关文章

  • 【题解】CF1485C Floor and Mod(二分答案,整除分块)
    【题解】CF1485CFloorandModemmm……NOIP考前两周,跟CSP考前一样(虽然最后并没有去考),写篇题解增加以下RP(雾)。提供一篇思路大体和题解区相同但用了二分写法的题解。......
  • P2254 [NOI2005] 瑰丽华尔兹 题解
    注意到可以设朴素转移方程\(f_{t,i,j}\)表示\(t\)时刻钢琴在\((i,j)\)时的最长滑动距离,这样复杂度是\(O(nmt)\)的,过不去。不过听说加点奇怪的优化能过?考虑一段时......
  • MySQL慢查询(下):问题解决,应用总结
    上篇回顾继上两篇:​​MySQL慢查询(上):你知道为啥会慢么?​​​​MySQL慢查询(中):正确的处理姿势,你get到了吗?​​在以上两篇内容中,我们一起探索了这些内容:SQL执行过程查询SQL为什......
  • 「题解」Codeforces 1098D Eels
    暴力是,每次挑出最小的两个合并。需要观察到没有产生贡献的次数很小。考虑最小的那个数的大小,如果一次合并没有产生贡献,那么最小的数至少\(\times2\).所以最多会有\(\mat......
  • [题解] [CSP-J 2022] 逻辑表达式 思路整理
    标签:分治。题目传送门:P8815[CSP-J2022]逻辑表达式题目大意给一个包含0、1、|、&、(、)的逻辑表达式(保证正确)。在计算表达式时采用“短路”策略:计算表达式a&b......
  • vs 加入目录下的文件不在解决方案窗口显示(我的是unreal,其他的也成立),必须手动加的问
    1、网上说的显示全部然后把非活动的包含,我的可能是项目太大,不行;2、使用一个foldertosolutionfolder插件,也不行,这个会将子文件夹单独生成一个项目;最后方案:删除*.sln文件,......
  • 题解 P4778【Counting swaps】
    problem一次操作指随意选定\(x,y\)并交换\(a_x,a_y\),请问有多少种方案,能用最少的操作次数重排一个排列\(a\)?\(n\leq10^5,P=10^9+7\)。solution0连边\(i\toa_i\)......
  • 模拟与高精度题解
    此题目特征为储存数字超过longlong类型,c++无法用一个变量存储全部数字解法为开数组来储存各个位上的数字1.字符高精度直接以两种方式处理字符即可#include<bits/std......
  • 小姿势 之 Android Studio 3.5 Retry 问题解决
    总会有那么一个人,让你觉得这个世界一切都是值得的。纵使结果不尽人意,曾经拥有即是最好。前言家里的MBP静静地躺了一段时间,某天心血来潮想嗨起来,其实就是瞎折腾一把,结果......
  • 洛谷 P4423 [BJWC2011]最小三角形 题解
    求平面最近点对的时候有这样一种思路:将所有点全部绕原点旋转同一个角度,然后按横坐标排序。根据数学直觉,在随机旋转后,答案中的两个点在数组中肯定不会离得太远。把这种......