乘法逆元 +数论分块 +平方和公式

news2024/11/18 3:40:48

年后准备学习啦,开学还得准备考试。

乘法逆元:

在这里插入图片描述
因为涉及到除法,所以取余这个操作就错误。
所以如果我们要求(a/b)%mod,我们可以假设
(a/b)%mod = a*c%mod
那么c就是b的逆元。

怎么求逆元呢,其实有很多方法,这里我先学习了两种比较常用的方法。

逆元的定义

给定正整数a,p,如果有ax \equiv 1 : (mod ; p),且a与p互质,则称x的最小正整数解为a模p的逆元。

方法一:拓展欧几里得算法

不要求模p为质数,所以我一般会用这种方法

欧几里得算法就是辗转相除法,一般用来求最大公约数
在理解拓展欧几里得算法之间先要理解一个裴属定理:
ax+by=gcd(a , b)
也就是说如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。
换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍

在这里插入图片描述有解的条件是gcd(a, p) = 1,即a、p互质,所以根据扩展欧几里得原理,就把问题等价于求解在这里插入图片描述
例:求6对于10^9+7的逆元

注意在递归中永远都是先得到上一层的结果状态

import java.util.Scanner;
public class Main {
	 static long x = 0;
	 static long y = 0;
	public static void main(String[] args) {
		new Main().solve();
	}
	void solve() {
		long mod = 1000000007;
		Scanner sc = new Scanner(System.in);
//		long n = sc.nextInt();
		long res=0;
		System.out.println(mod_inverse(6, mod));
		sc.close();
	}
	

	void extend_gcd(long a, long b){
	    if(b == 0){
	        x = 1;
	        y = 0;
	        return;
	    }
	    extend_gcd(b, a % b);
	    long tmp = x;
	    x = y;
	    y = tmp - (a / b) * y;
	}
	long mod_inverse(long a, long mod){
	    extend_gcd(a, mod);
	    return (x % mod + mod) % mod;
	}

}

方法二:费马小定理

要求p必须是质数
费马小定理:
在这里插入图片描述
然后在这里插入图片描述
如果p过大的话我们一般会用快速幂来解决
例:

import java.util.Scanner;
public class Main {
	 static long x = 0;
	 static long y = 0;
	 static long inv6 = 166666668; 
	public static void main(String[] args) {
		new Main().solve();
	}
	void solve() {
		long mod = 1000000007;
		Scanner sc = new Scanner(System.in);
//		long n = sc.nextInt();
		System.out.println(fermat(6, mod));
		sc.close();
	}

	long qmi(long a, long b, long mod){
	    long res = 1;
	    while(b!=0){
	        if((b & 1)==1) res = res * a % mod;
	        a = a * a % mod;
	        b >>= 1;
	    }
	    return res;
	}
	long fermat(long a, long mod){
	    return qmi(a, mod - 2, mod);
	}
}

数论分块:

数论跟我真的不熟,感觉它不想让我认识

这个是在求在这里插入图片描述
的时候一个办法

我们先打表理解一下,
若现在n为20,然后结果为下图(偷下懒,图借鉴大佬的)
在这里插入图片描述
我们可以看出来,有很多重复的值,那么我们可不可以从头开始看看当前值重复了几次然后相乘再往后找下一个值重复了几次然后相乘直到最后一个。
假设我们的左端点为l,那么右端点就为 n/(n/l)
重复次数即为(r-l+1),当前值为 n/l (其实n/r也一样,因为要向下取整)

所以得出结论

ans = 0;
for(int l = 1, r; l <= n; l = r + 1)
{
    r = n / (n / l);
    ans += n / l * (r - l + 1);
}

其实还有很多变式,可以看看这两篇博客
数论分块总结
数学–数论–整除分块(巨TM详细,学不会,你来打我)

平方和公式:

平方和公式:1²+2²+3²+…+n²=n(n+1)(2n+1)/6.

(a-b)³=a³-3a²b+3ab²-b³

13+23+.+n3=n2(n+1)2/4=[n(n+1)/2]2

(记一下以后可能有大用)

其实这些都是一道题总结的知识

因数平方和
题目描述
记 f(x) 为 x 的所有因数的平方的和。例如:f(12) = 12 + 22 + 32 + 42 + 62 + 122。

定义
给定 n, 求 g(n) 除以 109 + 7 的余数。

输入格式
输入一行包含一个正整数 n。
输出格式
输出一个整数表示答案 g(n) 除以 109 + 7 的余数。
样例输入
100000
样例输出
680584257

思路:一开始知道两重循环暴力会超时,然后就是我之前不会的数论了,
从1到n,i作为因子的次数为n/i,
所以g(n)还可以写成
在这里插入图片描述

又因为n/i向下取整,所以必定有若干i使得n/i等于同一个值,所以就用到了数论分块
例如下方
在这里插入图片描述
所以我们从1到n开始循环,计算等于n/l的数有几个,通过n/(n/l)找出最右端r,然后计算1到r的平方和再减去最左端之前的平方和就是当前重复的值的计算总和,然后再往后计算。
再计算平方和的时候肯定会用到平方和公式,然后因为要取余,平方和公式中要除以6,不能直接取余,所以我们要计算6对于模mod的逆元来代替除以6。

ac代码:

import java.util.Scanner;
public class Main {
	 static long x = 0;
	 static long y = 0;
	 static long inv6 = 166666668; 
	public static void main(String[] args) {
		new Main().solve();
	}
	void solve() {
		long mod = 1000000007;
		Scanner sc = new Scanner(System.in);
		long n = sc.nextInt();
		long res=0;
		long sum=0;
		long temp=0;
		long l=1;
		long r;
		while(l<=n) {
			r = n/(n/l);
			temp = sum;
			sum = r*(r+1)%mod*(2*r+1)%mod*inv6%mod;
			long v = (sum-temp+mod)%mod;
			res = (res+(n/l)%mod*v%mod)%mod;
			l= r+1;
		}
		System.out.println(res);
		sc.close();
	}
	
	void extend_gcd(long a, long b){
	    if(b == 0){
	        x = 1;
	        y = 0;
	        return;
	    }
	    extend_gcd(b, a % b);
	    long tmp = x;
	    x = y;
	    y = tmp - (a / b) * y;
	}
	long mod_inverse(long a, long mod){
	    extend_gcd(a, mod);
	    return (x % mod + mod) % mod;
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指定加拿大UBC|临床肿瘤专业应届博士成功获访问学者offer

G博士指定加拿大UBC&#xff0c;本人具有多年的临床工作经验&#xff0c;但科研产出较少。经过努力&#xff0c;最终我们落实了该校的访问学者职位。又历经半年的流程&#xff0c;G博士终于获得加拿大签证&#xff0c;前往UBC报到。建议&#xff1a;提前申请&#xff0c;预留出…

蓝桥杯刷题-入门题(终章一)

你是如风的少年~&#x1f603; 空 清新民谣版 - 汪小敏 - 单曲 - 网易云音乐 自在的少年 - 要不要买菜 - 单曲 - 网易云音乐 最后15道入门题&#xff0c;做完这15道&#xff0c;NEWOJ就91道题AC了 目录 一&#xff0c;数根 二&#xff0c;最大值和最小值&#xff08;I&…

Qt扫盲-QTime理论总结

QTime理论总结一、概述二、使用1. 属性获取2. 时间加减3. 字符串与QTime互转一、概述 QTime对象包含一个时钟时间&#xff0c;可以用小时数、分钟数、秒数和毫秒数来表示。它提供了比较时间和通过添加毫秒数来操作时间的函数。 QTime使用24小时时钟格式&#xff1b;它没有AM/…

bigemap如何设置等高线坐标系并输出

如何设置等高线坐标系并输出发布时间&#xff1a;2018-01-17 版权&#xff1a;投影设置及数据导出矢量等高线生成完成后&#xff08;详细生成过程参加上一章节&#xff1a;矢量等高线生成&#xff09;,我们就能够设置投影和导出等高线数据。投影设置我们生成等高线默认的坐标是…

大数据集群环境搭建

文章目录本文要点内容大纲一、大数据集群环境搭建1.1、分布式、集群概念初识1.2、集群环境搭建1.2.1、虚拟机克隆1.2.2、修改IP、主机名1.2.3、主机名和IP映射配置1.2.4、防火墙关闭1.2.5、集群机器间免密登录1.2.6、跨机器远程copy文件1.2.7、集群的时间同步问题二、Centos软件…

【3】Linux权限管控

学习笔记目录 初识Linux--入门Linux基础命令--会用Linux权限管控--懂权限Linux实用操作--熟练实战软件部署--深入掌握脚本&自动化--用的更强项目实战--学到经验云平台技术--紧跟潮流 认知root用户 root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、L…

【iMessage苹果家庭推推送源码】掀开应用程序“终端”,输入CDDESKTOP运转指令证书

推荐内容IMESSGAE相关 作者✈️IMEAX推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容3.日历推 *** …

沁恒CH32V307单片机入门(01):基础说明与流程体验

文章目录目的基础说明芯片介绍资料与工具开发环境流程体验开发调试下载总结目的 工作这几年单片机主要就接触过 Atmel、Renesas、Microchip、ST 这些厂家的&#xff0c;最近几年因为内部外部的各种因素单片机的价格和供应都挺不稳定的&#xff0c;将来会发生什么也不好说。另外…

python jenkins使用方法/使用笔记

笔者也经常在网上查询信息,但发现很多信息都是照搬,内容甚至有错误,可用性很低.笔者就认为如果要分享就应该把遇到的问题真实的分享出来,让更多同路人少走弯路.节约时间.觉得这篇文章有帮助的同学可以点个赞!将真有用的信息传递给更多人!常用的方法安装 jenkins 依赖pip instal…

python+django校园失物招领系统_13i29.

用户注册&#xff1a;用户填写用户名、密码、年级、姓名、电话号码、邮箱 &#xff0c;然后点击注册按钮进行注册。 用户登录&#xff1a;用户填写已经注册的用户名和密码并输入验证码&#xff0c;点击登录按钮进行登录。 搜索&#xff1a;用户可以在搜索栏输入关键字进行检索&…

京阳科技拟在上交所上市:计划募资12亿元,业绩波动较大

近日&#xff0c;山东京阳科技股份有限公司&#xff08;下称“京阳科技”&#xff09;预披露招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;京阳科技计划募资12亿元&#xff0c;用于10万吨/年新能源锂电池材料前驱体项目。 据招股书介绍&#xff0…

【刷题】珠玑妙算

至此&#xff0c;我终于明白了哈希表真正的妙用。 目录 文章目录 前言 一、珠玑妙算 二、具体实现 1.哈希表的构建 2.总结规律 1&#xff09;给出两个字符串&#xff1a;"YBBY"&#xff0c;"GYYB"&#xff0c;构建哈希表&#xff1a;&#xff08;少猜了一个…

ch2 计算机的发展史

1. 计算机的发展史 人类活动的需求&#xff0c; 推动因素&#xff1a; 电子技术的发展计算机体系结构技术的发展 1. 1 计算机的体系结构 冯诺依曼 体系结构的计算机&#xff1b; 以运算器为核心的 冯诺依曼结构&#xff1b; IBM 360 &#xff1a; 提出计算机系统结构的概念…

DeepTime:时间序列预测中的元学习模型

DeepTime&#xff0c;是一个结合使用元学习的深度时间指数模型。通过使用元学习公式来预测未来&#xff0c;以应对时间序列中的常见问题&#xff08;协变量偏移和条件分布偏移——非平稳&#xff09;。该模型是时间序列预测的元学习公式协同作用的一个很好的例子。 DeepTime架…

Win系统速览桌面功能失效 - 解决方案

Win系统速览桌面功能失效 - 解决方案问题解决方案步骤1&#xff1a;确保显卡驱动正常运行步骤2&#xff1a;检查任务栏设置步骤3&#xff1a;调整视觉效果问题 Win10系统支持用户鼠标悬停在任务栏右下角时速览桌面。但可能会因驱动和视觉效果设置等原因导致此功能失效。甚至任…

Linux基础IO+文件fd

1&#xff1a;文件理解文件内容属性&#xff0c;因此空文件在磁盘上也占用空间。文件用路径名文件名作为标识文件的唯一性。对文件的操作&#xff0c;就是对文件的内容属性的操作。在linux中&#xff0c;如果没有指定文件路径&#xff0c;默认在当前路径下执行操作。总结&#…

react配置环境变量

前端项目开发一般会区分三个环境&#xff1a; 本地环境&#xff08;及开发环境&#xff09;— development&#xff0c;测试环境 — test&#xff0c;生产环境 — production。 本地环境就是自己开发调试用的&#xff0c;一般是node起一个本地的服务&#xff0c;用webpack做接…

使用Python实现高效摸鱼,批量识别银行卡号码并且自动写入Excel表格

每当有新员工入职&#xff0c;人事小姐姐都要收集大量的工资卡信息&#xff0c;并且生成Excel文档&#xff0c;看到小姐姐这么辛苦&#xff0c;我就忍不住要去帮她了… 于是我用1行代码就实现了自动识别银行卡信息并且自动生成Excel文件&#xff0c;小姐姐当场就亮眼汪汪的看着…

如何制定一个好计划?运用SMART原则

很多人面对目标总是给自己找各种借口&#xff0c;为自己找理由&#xff0c;如没时间、做不到、没人脉、在潜意识里告诉自己还没准备好。人的天性就是逃避困难、贪图享乐&#xff0c;而保证执行力就是跟惰性抗争的过程。 这个世界没有好做不好的工作&#xff0c;只有&#xff0c…

Java Springboot+VUE前后端分离网上手机商城平台系统设计和实现以及论文报告

Java SpringbootVUE前后端分离网上手机商城平台系统设计和实现以及论文报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收…