时间:2022-09-23 09:34:09浏览次数:65  
标签:right frac limits 分块 数论 llt cdot 模板 left

简介

用于以 \(O(\sqrt n)\) 求解类似于 \(\sum\limits_{i = 1}^{\min_{j = 1}^{k}\{n_j\}}f(i)\times\prod\limits_{j = 1}^{k}\left\lfloor\frac{n_j}{i}\right\rfloor\) 的式子。

前提是可以方便的求出 \(f(i)\) 的前缀和。

#define llt long long int
llt NTS(llt* pre,llt upd,llt p) {
	llt res = 0LL;
	for(register llt l = 1, r;l <= upd;++l) {
		r = upd/(upd/l);
		res = (res+(upd/l)*(pre[r]-pre[l-1]+p)%p)%p;
	}
	return res;
}

例题

\(\textrm{luogu P2260 [清华集训2012]模积和}\)

求解 \(\sum\limits_{i = 1}^{n}\sum\limits_{j = 1}^{m}(n \bmod i)\cdot(m \bmod j)\;,\;(i \not= j)\)

本来不大难,但是 \(i\not=j\) 有点小麻烦。

\[\begin{aligned}ans &= \sum\limits_{i = 1}^{n}\left(n-\left\lfloor\frac{n}{i}\right\rfloor\cdot i\right)\times\sum\limits_{j = 1}^{m}\left(m-\left\lfloor\frac{m}{j}\right\rfloor\cdot j\right)-\sum\limits_{i = 1}^{n}\left(n-\left\lfloor\frac{n}{i}\right\rfloor\cdot i\right)\cdot\left(m-\left\lfloor\frac{m}{i}\right\rfloor\cdot i\right)\\ &= \left(n^2-\sum\limits_{i = 1}^{n}\left\lfloor\frac{n}{i}\right\rfloor\cdot i\right)\times\left(m^2-\sum\limits_{j = 1}^{m}\left\lfloor\frac{m}{j}\right\rfloor\cdot j\right)-\sum\limits_{i = 1}^{n}\left(n\cdot m-n\cdot \left\lfloor\frac{m}{i}\right\rfloor\cdot i-m\cdot \left\lfloor\frac{n}{i}\right\rfloor\cdot i+\left\lfloor\frac{n}{i}\right\rfloor\cdot \left\lfloor\frac{m}{i}\right\rfloor\right)\end{aligned}\]

数论分块即可。

顺便 \(\sum\limits_{i = 1}^{n}i = \frac{n\times(n+1)}{2}\) , \(\sum\limits_{i = 1}^{n}i^2 = \frac{n\times(n+1)\times(2\cdot n+1)}{6}\) 。

#include <iostream>
#define llt long long int
const llt moyn = 19940417;
const llt inv_2 = 9970209;
const llt inv_6 = 3323403;
llt n, m;
llt l, r;
llt res_1, res_2, res_3;
llt tmp_1, tmp_2, tmp_3;
llt pre_1(llt upd) {
	return upd*(upd+1LL)%moyn*inv_2%moyn;
}
llt pre_2(llt upd) {
	return upd*(upd+1LL)%moyn*((upd<<1)+1LL)%moyn*inv_6%moyn;
}
llt bmod(llt x) {
	return (x%moyn+moyn)%moyn;
}
int main() {
	scanf("%lld %lld",&n,&m);
	res_1 = n*n%moyn;
	res_2 = m*m%moyn;
	for(l = 1;l <= n;l = r+1) {
		r = n/(n/l);
		res_1 = bmod(res_1-(n/l)*bmod(pre_1(r)-pre_1(l-1)));
	}
	for(l = 1;l <= m;l = r+1) {
		r = m/(m/l);
		res_2 = bmod(res_2-(m/l)*bmod(pre_1(r)-pre_1(l-1)));
	}
	for(l = 1;l <= std :: min(n,m);l = r+1) {
		r = std :: min(n/(n/l),m/(m/l));
		tmp_1 = (r-l+1LL)*n%moyn*m%moyn;
		tmp_2 = ((n/l)*m+(m/l)*n)%moyn*bmod(pre_1(r)-pre_1(l-1))%moyn;
		tmp_3 = (n/l)*(m/l)%moyn*bmod(pre_2(r)-pre_2(l-1))%moyn;
		res_3 = bmod(res_3+tmp_1-tmp_2+tmp_3);
	}
	printf("%lld\n",bmod(res_1*res_2-res_3));
	return 0;
}

标签:right,frac,limits,分块,数论,llt,cdot,模板,left
From: https://www.cnblogs.com/bikuhiku/p/NTS.html

相关文章

  • treap模板
    想不到我一把年纪了还要被回炉重造,感谢CP我记得好像写过一个平衡树的了?这次写是因为碰到作业题,是一个大号的贪心背包问题,思路不难整,但是需要特殊数据结构的加持其实就是......
  • 【学习笔记/模板】吉司机线段树
    吉司机线段树这里不会挂涩图了,相册或者公告板自取调了一晚上,刚改出来,有时间再更。P6242【模板】线段树3Code#include<cstdio>#include<algorithm>#defineLLlon......
  • 数列分块入门
    数列分块入门写在前面写得好的暴力叫分块,写得烂的分块叫暴力警钟敲烂修改时要先将原数组复制一份,否则无法应对边角块的修改。一定要特判$l$和$r$属于同一......
  • Tita 360度评估——员工通用胜任力测评问卷模板
    360评估指导语本次员工职业领导力素质测评由Tita360评估全程在线支持。Tita「360 评估」,申请试用请联系售前/售后顾问,或者直接在线预约演示本问卷通过对被评价者的......
  • 房产中介管理软件第7课:T4模板的使用
    因为创建Model、Repository、Service、Controller有大量重复的工作。除了一些通用的方法会整合到BaseRepository和BaseService里,剩余的还需要自定义。这时候就需要T4模板......
  • 如何创建service的时候使用template模板?
    什么模板 模板?什么鬼,其实非常的简单! 就是在创建service的时候,直接引用变量,获取变量的值,然后将这些值变成具体的参数值。 可以设置的参数 --hostname--mount......
  • sbatch命令在集群递交任务模板
     001、脚本模板#!/bin/bash#SBATCH-JTEST_NAME#本次作业的名称#SBATCH-pxhacnormala#指定作业队列名#SBATCH-o......
  • 30套各行业可视化模板,比Excel好看千倍!
    可视化大屏的目的是通过将数据在屏幕上可视化,帮助用户熟悉业务数据,以便于高效地处理信息、快速做出应答。 以下行业案例模板均来源于:山海鲸可视化  1. 医疗行业进......
  • C++ 模板类继承
    template<classT>classA{protected:voidTest(){printf("%f",0.1f);}};template<classT>classB:publicA<T>{public:voidTest2()......
  • redis基础系列~监控模板
    {"annotations":{"list":[{"builtIn":1,"datasource":"--Grafana--","enable":true,"hide":true,......