P2019 四平方和定理题解

【WIkiOI】【P2926】【黑白瓷砖】【Polya定理】【题解】 传送门:http://www.wikioi.com/problem/2926/ Polya定理,看到高精度就不想写C++……python打了个表……,题解&C++源码有空再发 import pdb for n in range(1,21): v=[[0]*22 for i in range(22)] tmp=[[0]*22 for i in range(22)] Has 阅读详情

Thanks to 雅可比,此题可以直接套用“雅可比四平方和定理”解决。

雅可比四平方和定理

聪明的雅可比证明了:自然数 n 表示为四个整数平方和的有序表示方式的数量为:
8 ∑ d ∣ n , 4 ∤ n d 8\sum_{d \mid n,4\nmid n}^{} d 8d∣n,4∤n∑​d

证明过程在这里:https://en.wikipedia.org/wiki/Jacobi%27s_four-square_theorem。

芝士铺垫

Miller Rabin

好解析:OIwiki
& dalao 好文章

我们小学二年级都学过费马小定理:

如果 p p p 是一个质数,而 a a a 不是 p p p 的质数,那么 $a^{p-1}\equiv 1 \pmod{p} $

原理有点复杂,可以看看上面的文章,因为篇幅原因不多展开。

代码如下:

int qmul(int a, int b, int p) { // 快速乘
	ull c = (ull)a * (ull)b - (ull)((long double)a / p * b + 0.5L) * (ull)p;
	if (c < (ull)p) return c;
	return c + p;
}
int qpow(int a, int b, int p) { // 快速幂
	int res = 1;
	while (b > 0) {
		if (b & 1) {
			res = qmul(res, a, p);
		}
		a = qmul(a, a, p);
		b /= 2;
	}
	return res;
}
bool MillerRabin(int n) {
	if (n < 2) {
		return false;
	}
	if (n == 2 || n == 3) {
		return true;
	}
	int d = n - 1, r = 0;
	while (!(d & 1)) {
		r++;
		d /= 2;
	}
	for (int k = 0; k < 10; ++k) {
		int a = rand() % (n - 2) + 2;
		int x = qpow(a, d, n);
		if (x == 1 || x == n - 1) {
			continue;
		}
		for (int i = 0; i < r - 1; i++) {
			x = qmul(x, x, n);
			if (x == n - 1) {
				break;
			}
		}
		if (x != n - 1) {
			return false;
		}
	}
	return true;
}

(虽然这个代码放到高精度里会炸,但既然都判断高精度是不是质数了……出题人非人哉)

Pollard-Rho

这个太过于奇妙了,导致我一点都解释不了,可以自行 BD。

代码如下:


int qmul(int a, int b, int p) {
	// 省略实现
}
int qpow(int a, int b, int p) { 
	// 省略实现
}
bool MillerRabin(int n) {
	// 省略实现
}

int gcd(int a, int b) {
	if (b == 0) {
		return a;
	}
	return gcd(b, a % b);
}
int PollardRho(int x) {
	int s = 0, t = 0, c = rand() % (x - 1) + 1;
	for (int g = 1; ; g *= 2, s = t) {
		int val = 1;
		for (int k = 1; k <= g; k++) {
			t = (qmul(t, t, x) + c) % x;
			val = qmul(val, abs(t - s), x);
			if ((k % 127) == 0) {
				int d = gcd(val, x);
				if (d > 1) {
					return d;
				}
			}
		}
		int d = gcd(val, x);
		if (d > 1) {
			return d;
		}
	}
}
int maxfac;
void fac(int x) {  
	if (x <= maxfac || x < 2) return;
	if (MillerRabin(x)) {             
		maxfac = max(maxfac, x); 
		return;
	}
	int p = x;
	while (p >= x) {
		p = PollardRho(x); 
	}
	while ((x % p) == 0) {
		x /= p;
	}
	fac(x);
	fac(p);
}

所以有了上面的芝士,我们可以先 AC 这道题

AC code:

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
using namespace std;
const int MOD = 1e9 + 7;
int qmul(int a, int b, int p) { 
	// 省略实现
}
int qpow(int a, int b, int p) {
	// 省略实现
}
bool MillerRabin(int n) {
	// 省略实现
}

int gcd(int a, int b) {
	// 省略实现
}
int PollardRho(int x) {
	// 省略实现
}
int maxfac;
void fac(int x) {  
	// 省略实现
}

signed main() { 
	int t;
	cin >> t;
	while (t--) {
		maxfac = 0;
		int n;
		cin >> n;
		fac(n);
		if (maxfac == n) {
			cout << "Prime\n";
		}
		else {
			cout << maxfac << endl;
		}
	}
	return 0;
}

此题写法

我们可以先根据雅可比四平方和定理敲出暴力代码:

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
using namespace std;
const int MOD = 1e9 + 7;
int solve(int n) {
	int ans = 0;
	for (int i = 1; i * i <= n; i++) {
		if(n % i == 0) {
			if (i % 4 != 0) {
				ans += i;
			}
			if (i * i != n && (n / i) % 4 != 0) {
				ans += (n / i);
			}
			ans %= MOD;
		}
	}
	return 8 * ans % MOD;
}
signed main() {
	int t; 
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		cout << solve(n) << endl; 
	}
	return 0;
}

直接 60 分拿到手!

那么我们根据前面的 MillerRabin 和 PollardRho,可以写出一下代码:

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
using namespace std;
const int MOD = 1e9 + 7;
int qmul(int a, int b, int p) { // 快速乘
	ull c = (ull)a * (ull)b - (ull)((long double)a / p * b + 0.5L) * (ull)p;
	if (c < (ull)p) return c;
	return c + p;
}
int qpow(int a, int b, int p) { // 快速幂
	int res = 1;
	while (b > 0) {
		if (b & 1) {
			res = qmul(res, a, p);
		}
		a = qmul(a, a, p);
		b /= 2;
	}
	return res;
}
bool MillerRabin(int n) {
	if (n < 2) {
		return false;
	}
	if (n == 2 || n == 3) {
		return true;
	}
	int d = n - 1, r = 0;
	while (!(d & 1)) {
		r++;
		d /= 2;
	}
	for (int k = 0; k < 10; ++k) {
		int a = rand() % (n - 2) + 2;
		int x = qpow(a, d, n);
		if (x == 1 || x == n - 1) {
			continue;
		}
		for (int i = 0; i < r - 1; i++) {
			x = qmul(x, x, n);
			if (x == n - 1) {
				break;
			}
		}
		if (x != n - 1) {
			return false;
		}
	}
	return true;
}

int gcd(int a, int b) {
	if (b == 0) {
		return a;
	}
	return gcd(b, a % b);
}
int PollardRho(int x) {
	int s = 0, t = 0, c = rand() % (x - 1) + 1;
	for (int g = 1; ; g *= 2, s = t) {
		int val = 1;
		for (int k = 1; k <= g; k++) {
			t = (qmul(t, t, x) + c) % x;
			val = qmul(val, abs(t - s), x);
			if ((k % 127) == 0) {
				int d = gcd(val, x);
				if (d > 1) {
					return d;
				}
			}
		}
		int d = gcd(val, x);
		if (d > 1) {
			return d;
		}
	}
}
int maxfac;
void fac(int x) {  
	if (x <= maxfac || x < 2) return;
	if (MillerRabin(x)) {             
		maxfac = max(maxfac, x); 
		return;
	}
	int p = x;
	while (p >= x) {
		p = PollardRho(x); 
	}
	while ((x % p) == 0) {
		x /= p;
	}
	fac(x);
	fac(p);
}

int solve_60(int n) {
	int ans = 0;
	for (int i = 1; i * i <= n; i++) {
		if(n % i == 0) {
			if (i % 4 != 0) {
				ans += i;
			}
			if (i * i != n && (n / i) % 4 != 0) {
				ans += (n / i);
			}
			ans %= MOD;
		}
	}
	return 8 * ans % MOD;
}

int solve(int n) {
	// 让 n 不为 4 的倍数
	while (n % 4 == 0) {
		n /= 2;
	} 
	
	int ans = 1;
	
	while (n != 1) {
		maxfac = 0;
		fac(n);
		int there = 1;
		int temp = maxfac;
		while(n % maxfac == 0) {
			there += temp;
			temp *= maxfac;
			there %= MOD;
			n /= maxfac;
		}
		ans *= there;
		ans %= MOD;
	}
	
	return 8 * ans % MOD;
}
signed main() {
	int t; 
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		cout << solve(n) << endl; 
	}
	return 0;
}

AC!

完结撒花!

纪念我的首黑!

P4708画画 题解——Polya定理与图论的完美结合 Description 求 nnn 个点的本质不同的无标号的每个连通块有欧拉回路的无向简单图个数。 答案对 998244353998244353998244353 取模。 1≤n≤501 \le n \le 501≤n≤50,时限 3s\text{3s}3s 。 Solution Lemma 1 一个满足要求的图,其每个节点的度数均为偶数。 我们考虑关于点的置换 P(P∈S)P(P \in S)P(P∈S) 。根据 Burnside 定理不难得到 ans=1∣S∣∑PC(P)ans=\frac {1} { 阅读详情

相关推荐

题解:洛谷 P5091 【模板】扩展欧拉定理

等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。#提高+# #欧拉定理#本文分享的必刷题目是从。

团爸讲算法 990

[蓝桥杯] 四平方和

[蓝桥杯] 四平方和 峰值内存消耗 < 256M  CPU消耗 < 3000ms 【题目描述 - Problem Description】 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 ...

283

AlertManager的使用(邮件和微信告警)

一、AlertManager概述 Prometheus 包含一个报警模块,就是我们的 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组等,是一款前卫的告警通知系统。 Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertman

weixin_45880055的博客 2万+

2016年省赛第七届蓝桥杯B组C/C++第八题解 四平方和

第八题:四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法。 要求你对4个数排序: 0 <= a <= b <= c <= d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表.

Rlynn的博客 342

AGM Supra软件从零到一:国产CPLD工程创建全流程实战解析

本文详细解析了AGM Supra软件在国产CPLD开发中的全流程实战操作,从工程创建到代码开发、编译调试,再到高级技巧与疑难排解。特别对比了Supra与Quartus的差异,提供了工程路径管理、Quartus项目转换、HDL代码规范等实用技巧,帮助开发者高效完成CPLD项目开发。

weixin_29193259的博客 503

全网最全医学图像数据汇总

本仓库汇总了多个领域的医学图像开源数据集,涵盖CT、MRI、超声、内窥镜、病理、多模态、PET、OCT以及皮肤镜等多种成像技术。每个数据集均详细列出了任务类型、部位、格式、数量及下载链接,旨在为医学图像研究者提供便捷的资源导航。⚠️:这些数据集仅适用于学术研究用途。

2401_83173765的博客 3319

2016蓝桥杯C++ B组部分题解 凑算式 四平方和 交换瓶子

凑算式 这个算式中A ~ I代表1 ~ 9的数字,不同的字母代表不同的数字 比如: 6+8/3+952/714 就是一种解法, 5+3/1+972/486 是另一种解法。 这个算式一共有多少种解法? 注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。 解题思路: 在这里插入代码片 四平方和 题目描述 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方...

zhbbbbbb的博客 399

AC7811无感FOC实战:从开环到闭环的电机控制调试全记录

本文详细记录了基于国产AC7811芯片实现无感FOC电机控制的全过程。从硬件软件环境搭建、开环I/F启动调试,到滑模观测器参数整定,再到平滑切入闭环及双环PID调节,提供了完整的实战步骤与参数调试心法。文章重点分享了无感控制从开环到闭环切换的关键技巧与常见问题排查清单,为工程师提供了一份避坑指南。

kotlin6android的博客 713

【洛谷 P8635】[蓝桥杯 2016 省 AB] 四平方和 题解(数学+暴力枚举)

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。502021222。712121222。对于一个给定的正整数,可能存在多种平方和的表示法。要求你对4个数排序使得0≤a≤b≤c≤d。并对所有的可能表示法按abcd为联合主键升序排列,最后输出第一个表示法。

HEX9CF的技术博客 1072

C# 进阶:打造WinForms中的动态交互式UserControl

本文深入探讨了如何在C# WinForms中创建动态交互式UserControl,以提升桌面应用的用户体验和代码复用性。通过剖析UserControl生命周期、事件体系,并结合一个可拖拽缩放的分割面板实战案例,详细讲解了鼠标键盘事件处理、自定义绘制、状态管理以及性能优化等核心技巧,帮助开发者封装复杂交互逻辑,打造专业级自定义控件。

weixin_29279153的博客 462

6.4 构网型储能的需求与配置

摘要: 构网型储能是新型电力系统的关键支撑技术,通过提供电压/频率形成、惯性和稳定控制能力,解决同步机退出导致的系统稳定性问题。其配置需遵循三大原则:1)容量配置以支撑需求为主导,兼顾能量服务;2)优先布局于电网薄弱点、稳定问题突出区域;3)采用自适应控制策略实现全工况优化。核心应用场景包括新能源送出通道稳定、负荷中心调频、黑启动电源等。规划方法需结合系统分析、量化指标和成本效益评估,实现技术经济最优。未来需重点关注构网/跟网混合系统的临界容量占比及自适应控制技术发展。

技术工作者 1141

P4549 【模板】裴蜀定理 题解

P4549 【模板】裴蜀定理 题解

yaosichengalpha的博客 1137

【git】git: ‘interpret-trailers’ is not a git command. See ‘git --help’

cents 7.6系统. yum源安装git最新版本是1.8.3 报错: git: 'interpret-trailers' is not a git command. See 'git --help'. cannot insert change-id line in .git/COMMIT_EDITMSG 解决: git add xxx git commit -m "xxx" 然后修改 vim .git/hooks/commit-msg #if test -n "${reviewurl}" ; th

machh的专栏 4759

LeetCode 279. 完全平方数 (C#实现)——动态规划,四平方和定理

问题:https://leetcode-cn.com/problems/perfect-squares/ 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n = 12 输出: 3 解释: 12 = 4 + 4 + 4. 示例 2: 输入: n = 13...

weixin_30376509的博客 299

智慧园区——解读零碳智慧园区全域双碳管理建设方案【附全文阅读】

《零碳智慧园区全域双碳管理建设方案》为园区开发运营企业、政府部门及绿色能源服务商等提供系统性指导。方案基于"背景-理念-路径"框架,首先分析全球双碳趋势及我国园区高碳排放现状,明确零碳园区价值;其次提出"数字+绿色"双动力理念,构建数字底座与绿色能源体系;最后详细规划实施路径,包括碳排查、绿能规划、能效优化、碳交易等全流程管理,结合数字孪生技术实现可视化管控,助力园区实现碳中和目标。

cdfunlove的博客 206

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

1221. 四平方和 (hash

添加链接描述 1221. 四平方和 题目 提交记录 讨论 题解 视频讲解 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和。 如果把 0 包括进去,就正好可以表示为 4 个数的平方和。 比如: 5=02+02+12+22 7=12+12+12+22 对于一个给定的正整数,可能存在多种平方和的表示法。 要求你对 4 个数排序: 0≤a≤b≤c≤d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法。 输入格式 输入一个正整数 N。 输出格式 输

我见青山多妩媚,料青山见我应如是 226

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

P10423题解

将所有水平和竖直走过距离平移到一起,就可以用勾股定理算出答案,综上所述,暴力枚举即可求得正解,代码如下。小球最后要回到原点,所以水平方向与竖直方向上走过的距离肯定是边长的偶数倍,又因为水平走过。个单位,所以水平方向与竖直方向上走过的距离之比一定是。个人,每个人应该与除自己以外的其他。个人握手,上过小学的都知道,一共是。人彼此之间没有进行握手,即少了。篇题解,希望能帮助大家。

Zhou2010_的博客 1330

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

P1586 四方定理题解

P1586 四方定理 题意:题意很简单。 解法:听说这题能四重循环+剪枝过,时间复杂度得卡一卡,正解是dp,dp大法好 ,用递推考虑,dp[j][k]表示j用k个平方数表示的方案数,转移方程就是dp[j][k]=∑dp[j−i∗i][k−1]dp[j][k]=\sum dp[j-i*i][k-1]dp[j][k]=∑dp[j−i∗i][k−1],正序也有用到完全背包的思想,背包九讲(手动滑稽)。 代码: #include<bits/stdc++.h> using namespace std;

小白菜的博客 597

Pólya定理初探

Pólya定理初探 Pólya原理是组合数学中,用来计算全部互异的组合状态的个数的一个十分高效、简便的工具。 在介绍polya定理之前,先介绍几个概念       群:给定一个集合G={a,b,c,…}和集合G上的二元运算,并满足: (a) 封闭性:"a,bÎG, $cÎG,a*b=c。 (b) 结合律:"a,b,cÎG, (a*b)*c=a*(b*c)。 (c) 单位元:$eÎG,"

JIA_char 1523

【笔记&题解】[HNOI2008] 洛谷 P1446 Cards [Burnside 引理 & Pólya 定理](更适合小初生的抽象代数教程 & 超多生活举例)

群论,离散数学,轨道-稳定子定理,Burnside 引理,Pólya 定理,一次性满足! 不会记得私信骚扰作者。

Isaac Regulus的博客 1738

P1405 苦恼的小明 题解

给定一个长度为n的数组aa1a2⋯an​​​mod10007的值。

Popandsoss2022的博客 1124

【洛谷】P1313 [NOIP2011 提高组] 计算系数 的题解

一题水水的数学题qaq,祝 CSP 初赛 rp++!其实就是一个组合数加上杨辉三角,根据二项式定理,最后在输出答案即可。

ZH_qaq的博客 1418

【题解】洛谷P4980 【模板】Pólya 定理[Pólya+莫反]

这道题跨了十天我才写完。中途去复习莫反了。

Isaac Regulus的博客 550

BZOJ 1041 [HAOI2008]圆上的整点:数学【费马平方和定理】

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 题意:   给定n(n <= 2*10^9),问你在圆x^2 + y^2 = n^2的圆周上,有多少个坐标为整数的点。 题解:   科普视频:http://www.bilibili.com/video/av12131743/   推导的大致思路:  ...

a1392136的博客 304

洛谷 P1586 四方定理

洛谷 P1586 四方定理题目题目描述四方定理是众所周知的:任意一个正整数n,可以分解为不超过四个整数的平方和。例如:25=12+22+22+42,当然还有其他的分解方案,25=42+32和25=52。给定的正整数n,编程统计它能分解的方案总数。注意:25=42+32和25=32+42视为一种方案。输入输出格式输入格式: 第一行为正整数t(≤100),接下来t行,每行一个正整数n(≤32768)。

faojie的博客 944

题解:P4777 【模板】扩展中国剩余定理(EXCRT)

本文介绍了如何利用扩展中国剩余定理(EXCRT)解决非互质模数的同余方程组问题。通过将两个同余方程转化为不定方程,使用扩展欧几里得算法求出通解,最终合并为单一方程。代码实现展示了这一过程,关键步骤包括求解公约数、调整解的范围,以及逐步合并所有方程。该方法有效解决了传统中国剩余定理无法处理非互质模数的情况,最终输出最小非负整数解。

Benny_250的博客 713
上一篇: 【模板】三分 | 函数 使用 SA 解决
Python_enjoy
博客等级 码龄4年 1201粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值