数论风骚套路汇总(不定期更新)

2024-02-04 11:48

本文主要是介绍数论风骚套路汇总(不定期更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

          • 10.30日更新(多项莫比乌斯反演)
          • 10.31日更新

数论这个东西,确实值得深刻的研究。这里专门开一篇博客,记录遇见的一些奇技淫巧,一些妖艳的操作。(不定期更新)


10.30日更新(多项莫比乌斯反演)

∑ i = 1 a 1 ∑ j = 1 a 2 … … ∑ x = 1 a x g c d ( i , j … … , x ) \sum_{i=1}^{a_1}\sum_{j=1}^{a_2}……\sum_{x=1}^{a_x}gcd(i,j……,x) i=1a1j=1a2x=1axgcd(i,j,x)其中循环的 ∑ \sum 最多有10个。

这道题看上去很不可做,但实际上跟BZOJ2005这道题的本质和推法是一样的。
m i n min min a 1 … … a x a_1……a_x a1ax中的最小值

∑ i = 1 a 1 ∑ j = 1 a 2 … … ∑ x = 1 a x g c d ( i , j … … , x ) = = ∑ i = 1 a 1 ∑ j = 1 a 2 … … ∑ x = 1 a x ∑ k = 1 m i n k ∗ [ g c d ( i , j … … , x ) = k ] \sum_{i=1}^{a_1}\sum_{j=1}^{a_2}……\sum_{x=1}^{a_x}gcd(i,j……,x)==\sum_{i=1}^{a_1}\sum_{j=1}^{a_2}……\sum_{x=1}^{a_x}\sum_{k=1}^{min}k*[gcd(i,j……,x)=k] i=1a1j=1a2x=1axgcd(i,j,x)==i=1a1j=1a2x=1axk=1mink[gcd(i,j,x)=k]

= ∑ k = 1 m i n k ∗ ∑ i = 1 a 1 k ∑ j = 1 a 2 k … … ∑ x = 1 a x k [ g c d ( i , j … … , x ) = 1 ] = = ∑ k = 1 m i n k ∗ ∑ i = 1 a 1 k ∑ j = 1 a 2 k … … ∑ x = 1 a x k ∑ x ∣ g c d ( i , j … … , x ) μ ( x ) =\sum_{k=1}^{min}k*\sum_{i=1}^{\frac{a_1}{k}}\sum_{j=1}^{\frac{a_2}{k}}……\sum_{x=1}^{\frac{a_x}{k}}[gcd(i,j……,x)=1]==\sum_{k=1}^{min}k*\sum_{i=1}^{\frac{a_1}{k}}\sum_{j=1}^{\frac{a_2}{k}}……\sum_{x=1}^{\frac{a_x}{k}}\sum_{x|gcd(i,j……,x)}\mu(x) =k=1minki=1ka1j=1ka2x=1kax[gcd(i,j,x)=1]==k=1minki=1ka1j=1ka2x=1kaxxgcd(i,j,x)μ(x)

= ∑ k = 1 m i n k ∗ ∑ x = 1 m i n k μ ( x ) [ a 1 k x ] [ a 2 k x ] … … [ a x k x ] = = ∑ k = 1 m i n k ∗ [ a 1 k ] [ a 2 k ] … … [ a x k ] φ ( k ) =\sum_{k=1}^{min}k*\sum_{x=1}^{\frac{min}{k}}\mu(x)[\frac{a_1}{kx}][\frac{a_2}{kx}]……[\frac{a_x}{kx}]==\sum_{k=1}^{min}k*[\frac{a_1}{k}][\frac{a_2}{k}]……[\frac{a_x}{k}]φ(k) =k=1minkx=1kminμ(x)[kxa1][kxa2][kxax]==k=1mink[ka1][ka2][kax]φ(k)

于是就可以开心的数论分块喽!

#include<bits/stdc++.h>
#define MAXN 1000005
#define inf 2147483647
#define ll long long
using namespace std;
const ll MD=1e9+7;
ll read(){char c;ll x;while(c=getchar(),c<'0'||c>'9');x=c-'0';while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0';return x;
}
ll T,n,i,s,top,l,r,Min,ans,a[15],vis[MAXN],pri[MAXN],phi[MAXN],sum[MAXN];
void pre(){vis[1]=1;phi[1]=1;sum[1]=1;for(ll i=2;i<=1000000;i++){if(!vis[i]) pri[++top]=i,phi[i]=i-1;for(ll j=1;j<=top&&i*pri[j]<=1000000;j++){vis[i*pri[j]]=1;if(i%pri[j]) phi[i*pri[j]]=phi[i]*phi[pri[j]]%MD;else{phi[i*pri[j]]=phi[i]*pri[j]%MD;break;}}sum[i]=sum[i-1]+phi[i];}
}
int main()
{T=read();pre();while(T--){n=read();l=1;ans=0;Min=2e9;for(ll i=1;i<=n;i++) a[i]=read(),Min=min(Min,a[i]);while(l<=Min){r=inf;s=1;for(ll i=1;i<=n;i++) {r=min(r,a[i]/(a[i]/l));s=(a[i]/l*s)%MD;}(ans+=(sum[r]-sum[l-1]+2*MD)%MD*s%MD)%MD;l=r+1;}printf("%lld\n",ans%MD);}return 0;
}

10.31日更新

f ( x ) = ∑ i = 1 ∞ ∑ j = 1 ∞ [ i ∗ j ∣ x ] f(x)=\sum_{i=1}^{\infty}\sum_{j=1}^{\infty}[i*j|x] f(x)=i=1j=1[ijx],求 ∑ i = 1 n f ( i ) \sum_{i=1}^{n}f(i) i=1nf(i)

这道题的关键点就是转化,我们将条件转化,假设 x i ∗ j = k \frac{x}{i*j}=k ijx=k,那么我们求 f ( x ) f(x) f(x)只要枚举三元组 ( i , j , k ) (i,j,k) (i,j,k)即可。

我们先假设 a ≤ b ≤ c a\leq b\leq c abc,那么我们 a a a 1 1 1 n 3 \sqrt[3]{n} 3n 枚举, b b b a a a x a \sqrt{\frac{x}{a}} ax 枚举,也就是for(ll a=1;a*a*a<=n;a++) for(ll b=a;a*b*b<=n;b++),那

c c c就可以取 [ b , n a ∗ b ] [b,\frac{n}{a*b}] [b,abn],因为这样相乘都 ≤ n \leq n n。于是用方案乘以这三元组倒换顺序的方案数即可。

核心代码,可以证明复杂度是 O ( n 2 3 ) O(n^{\frac{2}{3}}) O(n32),非常优秀。

for(ll a=1;a*a*a<=n;a++)    for(ll b=a;a*b*b<=n;b++){    ll c=n/(a*b);    if(c<b) break;   if(a==b)   ans+=(c-b)*3+1;  else   ans+=(c-b)*6+3; }

这篇关于数论风骚套路汇总(不定期更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677391

相关文章

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

数论ZOJ 2562

题意:给定一个数N,求小于等于N的所有数当中,约数最多的一个数,如果存在多个这样的数,输出其中最大的一个。 分析:反素数定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数。 性质一:一个反素数的质因子必然是从2开始连续的质数。 性质二:p=2^t1*3^t2*5^t3*7

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

POJ2247数论

p = 2^a*3^b*5^c*7^d 求形如上式的第n小的数。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.u