2904: 平方和

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 160  Solved: 73
[Submit][Status][Discuss]

Description

给定一个整数N,求N最少可以拆成多少个完全平方数的和

Input

第一行一个整数TEST,表示数据组数
接下来TEST行,每行一个整数N

Output

TEST行,每行一个正整数,表示N最少可以拆成多少个完全平方数的和。  
0≤N≤10^18 ,TEST<=1000

Sample Input

5
413357
567226
766291
597007
289611

Sample Output

3
3
3
4
3

拉格朗日四平方和定理:每个正整数均可表示为4个整数的平方和

所以这道题的答案不会超过4

①答案为1:直接对n开更号判断即可

②答案为2:将n进行质因数分解(因为较大所以要用Pollard_rho算法),所有对4取模为3的质因数次数都是偶数

性质:假设n为两个答案为2的数相乘,那么Ans[n]还是等于2

③答案为3:如果不满足其他所有条件,那么答案就为3了hh

④答案为4:n可以表示成4^x(8m+7)(x和m都为整数)的形式

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define LL long long
int t, cnt, pri[50005], a[50005] = {1,1};
LL fat[101];
LL Multi(LL a, LL b, LL mod)
{LL t;a %= mod, b %= mod;t = a*b-(LL)((double)a/mod*b+0.5)*mod;t = (t+mod)%mod;return t;
}
/*
LL Multi(LL a, LL b, LL mod)        //和上面一样,但比上面慢很多
{LL ans = 0;a %= mod;while(b){if(b%2==1)  ans = (ans+a)%mod, b--;else  a = (a+a)%mod, b /= 2;}return ans;
}
*/
LL Pow(LL a, LL b, LL mod)
{LL ans = 1;a %= mod;while(b){if(b&1)  ans = Multi(ans, a, mod), b--;else  a = Multi(a, a, mod), b /= 2;}return ans;
}
LL Gcd(LL a, LL b)
{if(b==0)return a;return Gcd(b, a%b);
}
int Miller_Rabin(LL n)
{int i, j, k;LL a, x, y, mod;if(n==2)  return 1;if(n<2 || n%2==0)  return 0;k = 0, mod = n-1;while(mod%2==0){k++;mod /= 2;}for(i=1;i<=10;i++){a = rand()%(n-1)+1;x = Pow(a, mod, n);y = 0;for(j=1;j<=k;j++){y = Multi(x, x, n);if(y==1 && x!=1 && x!=n-1)return 0;x = y;}if(y!=1)return 0;}return 1;
}
LL Divi(LL n)
{LL i, k, x, y, p, c;if(n==1)return 1;k = 2, p = 1;y = x = rand()%n, c = rand()%(n-1)+1;for(i=1;p==1;i++){x = (Multi(x, x, n)+c)%n;p = abs(x-y);p = Gcd(n, p);if(i==k)y = x, k *= 2;}return p;
}void Pollard_rho(LL n)
{LL p;if(n==1)return;if(Miller_Rabin(n))fat[++cnt] = n;else{p = Divi(n);Pollard_rho(n/p);Pollard_rho(p);}
}int Jud2(LL n)
{int i, sum;cnt = 0;Pollard_rho(n);sort(fat+1, fat+1+cnt);for(i=1;i<=cnt;i++){if(fat[i]%4==3){sum = 1;while(fat[i]==fat[i+1])i++, sum++;if(sum%2==1)return 0;}}return 1;
}int main(void)
{LL T, n, i, j, t;for(i=2;i<50000;i++){if(a[i]==0)pri[++cnt] = i;for(j=i*i;j<=50000;j+=i)a[j] = 1;}scanf("%lld", &T);while(T--){scanf("%lld", &n);t = sqrt(n);if(t*t==n)printf("1\n");else if(Jud2(n))printf("2\n");else{while((n&3)==0)n /= 4;if(n%8==7)printf("4\n");elseprintf("3\n");}}return 0;
}

Pollard_rho大数质因数分解+拉格朗日四平方和定理(bzoj 2904: 平方和)相关推荐

  1. upc组队赛16 GCDLCM 【Pollard_Rho大数质因数分解】

    GCDLCM 题目链接 题目描述 In FZU ACM team, BroterJ and Silchen are good friends, and they often play some int ...

  2. 拉格朗日四平方和定理c语言,拉格朗日四平方定理的证明

    黄波 [摘 要]拉格朗日四平方定理又被称为Bachet猜想.说的是任何正整数都能被写成至多4个数的平方和.虽然定理由费马用无限下降的方法给出了证明,但证明过程很繁杂.欧拉没有成功证明定理.对这个定理第 ...

  3. 【Python】对大数质因数分解的算法问题

    [Python]对大数质因数分解的算法问题 发现问题 尝试分析 最后 我的代码(C1) 百科代码(C2) 发现问题   我是一个初学者,在编写一个分解质因数的代码时,学习到了 Miller-Rabin ...

  4. 高斯整数 / 费马平方和定理 / 拉格朗日的四平方定理

    一.高斯整数 形如 .(其中a,b是整数)的复数被称为高斯整数,高斯整数全体记作Z[i].注意到若 γ=a+bi 是高斯整数,则它是满足如下方程的代数整数: 通常我们使用希腊字母来表示高斯整数,例如α ...

  5. 两数平方和定理,勒让德三平方和定理,拉格朗日四平方和定理

    婆罗摩笈多-斐波那契恒等式 婆罗摩笈多-斐波那契恒等式(Brahmagupta–Fibonacci identity): ( a 2 + b 2 ) ( c 2 + d 2 ) = ( a c − b ...

  6. 拉格朗日四平方和定理c语言,费马平方和定理 拉格朗日四平方和定理

    费马平方和定理 费马平方和定理:奇质数能表示为两个平方数之和的充分必要条件是该质数被4除余1.第一步 "如果两个整数都能表示为两个平方数之和,则它们的积也能表示为两个平方数之和." ...

  7. Python 大数的质因数分解

    肝了一天总算把大数质因数分解搞定了,这篇文章主要涉及了 Pollard rho 算法和试除法 我用了若干个质数的平方来对比这两个算法的性能,发现: 7e5 以上的数用 Pollard rho 算法更快 ...

  8. 拉格朗日四平方和定理

    目录 一,拉格朗日四平方和定理 二,证明过程 三,推论 四,OJ实战 CSU 1404 Four-square Theorem 力扣 279. 完全平方数 一,拉格朗日四平方和定理 每个正整数均可表示 ...

  9. xjoi 1542 玩玩拉格朗日四平方和定理

    题目描述: 拉格朗日四平方和定理: 每一个非负整数都可以表示成四个非负整数的平方和. 例如 5 = 0^2 + 0^2 + 1^2 + 2^2 给定一个正整数n,请你将n拆成 a^2+b^2+c^2+ ...

最新文章

  1. mysql 触发器死循环_请教如何避免该条触发器的死循环
  2. 手把手带你剖析 Springboot 启动原理!
  3. python 3 最佳python中文书籍下载
  4. 第三章.数据类型和运算符
  5. 算法提高 身份证排序
  6. 信号处理常用算法介绍
  7. linux c之strncpy函数和strncmp函数最简单使用总结
  8. python同步应用:多个线程有序执行
  9. PclZip:强大的PHP压缩与解压缩zip类
  10. 音视频开发(2)---red5+java打造直播平台系列 初级
  11. Ubuntu配置Wine教程
  12. 计算机日志文件事件ID,系统日志出现事件 ID:16001来源:AFD的警告
  13. 个人java课设的心得体会收获_java课程设计心得体会
  14. [渝粤教育] 长沙民政职业技术学院 高职公共英语(三) 参考 资料
  15. 【数据结构与算法】之深入解析“1比特与2比特字符”的求解思路与算法示例
  16. 服务器文件夹共享到本地,云服务器共享本地文件夹
  17. 小米手机安装Google框架
  18. 6-3 每个单词的首字母改为大写 (10 分)
  19. cad展点kszd小程序_CAD坐标展点脚本文件-CAD坐标展点程序下载v2 官方版-西西软件下载...
  20. 张俊红 python_我的朋友张俊红成长之路

热门文章

  1. python常用代码总结-python常用代码
  2. 零基础学python全彩版答案-零基础学Python(全彩版)
  3. 自主品牌语音交互性能测评,荣威RX5反应更快,博越变暖男
  4. 基于单片机和语音识别的智能家电控制平台
  5. php中splite,PHP语言 的 chunk_split() 函数
  6. php路径伪静态化,URL地址伪静态化
  7. perl linux 独立运行,Perl脚本打包为独立执行程序
  8. linux根据端口号找目录,linux篇---根据端口号查看进程位置
  9. phpmyadmin/scripts/setup.php,Linux下phpMyAdmin安装过程中的问题解决
  10. jQuery 学习-样式篇(一):如何引用 jQuery