首页 > 其他分享 >数论分块

数论分块

时间:2024-03-15 20:00:11浏览次数:23  
标签:分块 数论 res long int include define

数论分块

分块整除

DADKKWPOGJKA(1)

例题

G-几番烟雾,只有花难护

向上取整

注意相减时要加上模数再取模

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define db(x) cout<<x<<" "<<endl;
#define _db(a,n) for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int M=998244353;
int fp(int b,int p){
	int res=1;
	while(p){
		if(p&1) res=res*b%M;
		b=b*b%M;
		p>>=1;
	}
	return res;
}
int s=fp(6,M-2)%M;
int f(int n){
	return((n*(n+1)%M*(n*2+1)%M)%M*s)%M;
}
void solve(){
	int n;cin>>n;
	int ans=0;
	for(int l=1,r,k;l<=n;l=r+1){
		k=(n+l-1)/l;
		if(k==1) r=n;
		else r=(n-1)/(k-1);
		ans+=k*(f(r)-f(l-1)+M)%M;//注意相减时要加上模数再取模
	}
	cout<<(ans+M)%M<<endl;
}
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int t;cin>>t;while(t--)
	solve();
	return 0;
}



根号分治

复习更新

P3396 哈希冲突 - 洛谷

#include <iostream>
#include<bits/stdc++.h>
#include <algorithm>
#include <cstring>
using namespace std;
#define endl '\n'
#define int long long
#define debug(x) cout<<x<<" "<<endl;
#define _debug(a,n) for(int i=0;i<n;i++) cout<<a[i]<<" ";cout<<endl;
#define mem(a) memset(a,0, sizeof(a))
const int N=2e5+5;
int a[N],ans[400][400];
signed main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
	int n,m,x,y;cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	int s=sqrt(n);
	for(int i=1;i<=n;i++){
		for(int p=1;p<=s;p++){
			ans[p][i%p]+=a[i];//模p,余k 
		}
	}	
	while(m--){
		char cmd;
		cin>>cmd>>x>>y;
		if(cmd=='A'){
			if(x<=s){
				cout<<ans[x][y]<<endl;
			} 
			else{
				int res=0;
				for(int i=y;i<=n;i+=x){
					res+=a[i];
				}
				cout<<res<<endl;
			}
		}
		else {
			for(int i=1;i<=s;i++){
				ans[i][x%i]+=y-a[x];	
			}
			a[x]=y;
		}
	}
	return 0;
}

标签:分块,数论,res,long,int,include,define
From: https://www.cnblogs.com/mono-4/p/18076148

相关文章

  • Ynoi 大分块选做
    第二分块linkCF版本题意:给出一个序列\(a_{1...n}\),有\(m\)次操作。每次:修改:给出\(l,r,x\),表示把区间\([l,r]\)中\(>x\)的数减去\(x\)查询:给出\(l,r,x\),求\([l,r]\)中有多少个数\(=x\)\(1\len\le10^6,\space1\lem\le5\times10^5,\space0\lea_i,x......
  • 取反(分块+二分)
    第2题   取反 查看测评数据信息给一个长度是n的数组,a[1],a[2],a[3],...a[n-1],a[n],初始时a数组中所有的元素都为0,下面有两种操作:1.指定一个区间[x,y],把a[x],a[x+1],...a[y]的值取反,即如果a[i]的值为1则把a[i]的值变为0,如果a[i]的值为0则把a[i]的值变为12.指定一个区......
  • 统计数量(分块+二分)
    第1题   统计数量 查看测评数据信息给一个长度是n的正整数数组,a[1],a[2],a[3],...a[n-1],a[n],其中1<=a[i]<=1000。现在在数组a上进行m次操作:1.Mxyz,表示对a数组的闭区间[x,y]内所有a[i]的值分别加上z2.Axyzz,询问a数组闭区间[x,y]内有多少a[i]的值大于等于z......
  • 分块
    与线段树类似。是暴力的优化版,详细见下两个链接https://www.cnblogs.com/milky-w/p/8447724.htmlhttps://www.cnblogs.com/Miracevin/p/9403620.html  板子:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e5+5;intn,m,a[N],s......
  • 分块小结
    分块概念就是把一个长序列分成\(\sqrt{n}\)个区间,分别维护每个区间内的信息和,然后查询时可以优化时间复杂度。还可以完成一些线段树完成不了的神秘操作,比如这道题。但是总体时间复杂度不如线段树,但它的扩展性比线段树还要强,因为分块中每个区间的信息和不需要具有传递性。怎......
  • 数论
    在线\(O(1)\)逆元预处理\([1,k]\)逆元,找到一个\(u\)使得\(xu\bmodp\leqk\),则\(x^{-1}=(xu)^{-1}\cdotu\)。设\(x=qB+r\),其中\(B=p^{1/3}\),\(xu=quB+ru\)。凭感觉\(xu\bmodp\)的分布很均匀,因此我们可以让\(u\)小一些。\(u\leqp^{1/3}\)时\(ru\leqp^......
  • P5655 基础数论函数练习题 题解
    分析考虑莫队。令$S=\operatorname{lcm}(a_l,a_{l+1},a_{l+2},\dots,a_{r-1})$。则对于新加进来的$a_r$,有:$$\operatorname{lcm}(a_l,a_{l+1},a_{l+2},\dots,a_{r-1},a_r)\=\operatorname{lcm}(S,a_r)\=\frac{S\timesa_r}{\gcd(S,a_r)}$$很容易发现,$S$在不取模的情况下会......
  • 莫队与分块学习笔记
    分块思想介绍分块是一种思想,而不是一种数据结构。思想就是,将一块大的区间,转换成小的区间来处理。例如,在一个\(n\)长度上的数轴,我们可以将其分成\(\sqrtn\)个长度为\(\sqrtn\)的块来解决。典型问题对于一类很典型的问题,可以用分块来做。单点修改,区间查询这玩意咋......
  • 数论小记
    gcd辗转相除法,也可以直接用__gcd。线性筛保证每个数只会被其最小的质数筛掉,复杂度\(O(n)\),也可以用来处理积性函数,通常作为更复杂的筛法的预处理。exgcd可用于求解不定方程:\(ax+by=gcd(a,b)\)推导如下:\[ax+by=gcd(a,b)=gcd(b,a\bmodb)=bx'+(a\bmodb)y'......
  • (数论)裴蜀定理
    裴蜀定理内容:${ax+by=c,x\inZ^*,y\inZ^*}$成立的充要条件是${\gcd(a,b)|c}$。$Z^*$表示正整数集。 设${s=\gcd(a,b)}$,显然${s|a}$,并且${s|b}$又因为${x,y\inZ^*}$所以${s|ax,s|by}$显然要使得之前的式子成立,则必须满足$c$是$a$和$b$的公约数的倍数又因为$x$和$y$是......