HDU2683——欧拉完全数

题目要求符合等式的数,我们首先要做的就是分析这个数:

在这里插入图片描述

对于这个等式,我们可能什么都看不出来,左边很难化简的样子,所以我们就要想到通过变化怎么样把右边化成和左边形式差不多的样子。结合组合数我们想到二项式定理,展开得到
在这里插入图片描述
左边等于右边的话我们可以得到g(n)=2*n,因为n本身为自身的因子,那么n的小于自身的因子之和为自身说明n为完全数。
所以问题转换为如何求完全数。
由数论知识得任何一个完全数都可以写成 2p-1 *(2p-1)的形式,其中(2p-1)为素数(也叫做梅森素数)
梅森素数的条件为p为素数。
由以上(我靠比赛我到哪去找这些知识点),我们可以找到所有的完全数(其实也没有几个)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<map>
#include<queue>
#include<set>
#include<vector>using namespace std;typedef long long ll;
const int MAXN=1e5+5;ll mult(ll x,ll y,ll  p)
{long double d=1;d=d*x/p*y; return ((x*y-((ll)d)*p)%p+p)%p;
}ll quick_pow(ll a,ll b,ll p)
{ll ret=1; a%=p;while(b){if(b&1) ret=mult(ret,a,p);a=mult(a,a,p); b>>=1;}return ret;
}bool Miller_Rabin(ll n)
{const ll times=8;const ll prime[8]={2,3,5,7,11,13,17,61};if(n<2) return false; if(n==2) return true;for(int i=0;i<times;i++)if(n==prime[i]) return true; else if(!(n%prime[i])) return false;ll x=n-1; while(!(x&1)) x>>=1;for(int i=0;i<times;i++){ll a=prime[i]; ll now=quick_pow(a,x,n); ll last;if(x==n-1){if(now!=1) return false;}else{bool flag=false;while(x!=n-1){last=now;  now=mult(now,now,n);if(now==1){if(last==n-1 || last==1) flag=true; break;}x<<=1;}if(!flag) return false;}}return true;
}ll quick_pow(ll a,ll b)
{ll ret=1;while(b){if(b&1) ret*=a;a*=a; b>>=1;}return ret;
}const int prime[11]={2,3,5,7,11,13,17,19,23,29,31};int main()
{
/*for(int i=0;i<11;i++){ll t=quick_pow(2,prime[i]);ll a=t-1;//printf("a=%lld t=%lld \n",a,t);if(Miller_Rabin(a)){t/=2; printf("%lld\n",t*a);}}//找到的所有的完全数62849681283355033685898690561374386913282305843008139952128
*/char cmd[5]; ll a,b;const ll ans[8]={6,28,496,8128,33550336,8589869056,137438691328,2305843008139952128};while(~scanf("%s",cmd)){if(cmd[0]=='A'){scanf("%lld%lld",&a,&b);if(b<a) swap(a,b);int cnt=upper_bound(ans,ans+8,b)-lower_bound(ans,ans+8,a);printf("%d\n",cnt);}else{scanf("%lld",&a);printf("%d\n",upper_bound(ans,ans+8,a)-lower_bound(ans,ans+8,a));}}return 0;
}

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

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

相关文章

BZOJ-2005能量采集-数论函数

很入门的数论函数题目。我还是wa了一发&#xff08;爆long long 了&#xff09; 对于每个位置x,y&#xff0c;在他们和能量采集器中间的植物为gcd(x,y)-1&#xff0c;【在他们之间说明斜率相同&#xff0c;而和他们斜率相同的就是所有gcd(x/gcd(x,y),y/gcd(x,y))1的并且比他们小…

网络五层模型

TCP/IP五层模型 应用层: HTTP,HTTPS协议,其中HTTP没有对数据进行加密操作,但是HTTPS对数据进行了加密操作 其中HTTP端口号一般是80/8080等等,HTTPS端口号是443,SSH端口号一般是22,ftp是21 HTTP协议报头: 首行:请求方法,url,协议版本 请求报头: HOST:主机 Connection:长连接…

C++的静态成员函数指针

http://blog.csdn.net/sky453589103/article/details/47276789 先简单的说说非静态的成员函数。非静态成员函数指针的类型&#xff1a;类的非静态成员是和类的对象相关的。也就是说&#xff0c;要通过类的对象来访问变量。成员函数的类型定义为&#xff1a;typedef void (A::*p…

从一个字符串中删除另一个字符串中出现过的字符

http://blog.csdn.net/walkerkalr/article/details/39001155 定义一个函数&#xff0c;输入两个字符串&#xff0c;从第一个字符串中删除在第二个中出现过的所偶字符串。例如从第一个字符串"We are students."中删除第二个字符中“auiou”中出现过的字符得到的结果是…

SPOJ-VLATTICE Visible Lattice Points-莫比乌斯反演

需要将问题分解一下。 我们需要求的是这个立方体从(0,0,0)能看到的点的个数。可是在三个含有(0,0,0)的面上我们没有办法和其他的一起进行分析&#xff08;因为含有坐标是0&#xff0c;而我们的数论工具都是从1开始的&#xff09;&#xff0c;所以我们可以将那三个面分开考虑&a…

进程的通信

管道 什么是管道 由于进程之间是相互独立的,因此在进程与进程之间进行相互联系的时候,此时就需要采用一种机制,通过管道的方式将进程一个进程的执行数据交给另外一个进程,此时就可以以通过管道来实现 匿名管道和命名管道 匿名管道 创建一个匿名管道的方式是pipe(int pipe[…

获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf

http://blog.csdn.net/windeal3203/article/details/39320605 Linux 下 可以使用ioctl()函数 以及 结构体 struct ifreq 结构体struct ifconf来获取网络接口的各种信息。 ioctl 首先看ioctl()用法ioctl()原型如下&#xff1a;#include <sys/ioctl.h>int ioctl(int fd, i…

欧拉降幂

我们记f(n)为n的欧拉函数值&#xff0c;则 当B>f©时&#xff0c;AB%CAB%f©f©%C&#xff0c;这里A,C可能不互质。 很好用&#xff0c;证明很复杂&#xff0c;等有时间回来学习一下。

房多多面试总结

测试一个ATM机 功能上 取钱     正常         要取的钱的面值是否支持ATM机服务         要取的钱的数目是否小于等于存的钱的数目         要取的钱的数目大于存钱的数目     异常         取钱的时候操作出现异常&#xff0c;导致…

BZOJ3884上帝与集合的正确用法-欧拉函数

刚开始我想的是欧拉降幂&#xff0c;可是觉得复杂度还是挺高的就去找了一下题解。 思路大方向没有问题&#xff0c;仍然是使用欧拉函数降低指数然后递归处理。但是不是简单的使用欧拉降幂而是应该对模数p稍微处理一下。因为底数已经确定为2&#xff0c;所以我们可以将p写成p2k…

比较ArrayList和数组的区别

区别1:创建时的区别 一般数组在创建的时候都需要指定数组的大小&#xff0c;但是ArrayList不需要指定数组的大小 //创建一个ArrayList对象 ArrayList<String> myList new ArrayList<String>(); //创建一个数组 String [] myList new String[2];区别2&#xff1…

linux C如何获取服务器节点上所有网口的ip地址

http://blog.csdn.net/weiyuefei/article/details/22198659 之前项目原因&#xff0c;需要获取当前服务器节点上所有网口的ip地址&#xff0c;但是当时由于时间比较紧&#xff0c;一直没搞出来&#xff0c;最近没那么忙了&#xff0c;又在网上找了一下&#xff0c;终于实现了这…

HDU1573-模线性方程

模线性方程的模板题。&#xff08;卡了一会&#xff0c;发现读入弄错了&#xff09; #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cmath> #include<cstdlib> #include<ctime> #include<…

java中引用传递

基本概念 栈内存 所谓的栈内存就是存储进程在运行过程中变量的内存空间 堆内存 所谓的堆内存就是存储系统中数据的内存空间 数组相关的引用传递 先来看一段代码 public class ArrayDemo {public static void main(String[] args) {int[] x null;x new int[3];System.o…

(原创)C++11改进我们的程序之右值引用

http://www.cnblogs.com/qicosmos/p/3369940.html 本次主要讲c11中的右值引用&#xff0c;后面还会讲到右值引用如何结合std::move优化我们的程序。 c11增加了一个新的类型&#xff0c;称作右值引用(R-value reference)&#xff0c;标记为T &&&#xff0c;说到右值引用…

(原创)C++11改进我们的程序之move和完美转发

http://www.cnblogs.com/qicosmos/p/3376241.html 本次要讲的是右值引用相关的几个函数&#xff1a;std::move, std::forward和成员的emplace_back&#xff0c;通过这些函数我们可以避免不必要的拷贝&#xff0c;提高程序性能。move是将对象的状态或者所有权从一个对象转移到另…

微型个人博客服务器

Http相关简介 Http是应用层的基于请求响应的一个协议, 其中Http的请求响应可以分为四部分. 请求行, 请求报头,空行, 请求正文.其中请求行包括了请求方法, url, 版本号, 请求报头包括请求属性, 冒分割的键值对, 每组属性之间都以换行的形式分开, 最后一空行作为请求的结束标识.…

HDU6428-Calculate-数论函数

并不知道为什么同样一份代码早上超时下午就A了…好像数据是随机的? 做的第一道不是简单板题的数论函数题.果然做不出来… 在网上研究了好久,才算稍微研究明白.看到了两种推导的思路.(写了半天发现讲起来好麻烦,有时间再来更新) #include<cstdio> #include<cstring&g…

[C/C++]关于C++11中的std::move和std::forward

http://blog.sina.com.cn/s/blog_53b7ddf00101p5t0.htmlstd::move是一个用于提示优化的函数&#xff0c;过去的c98中&#xff0c;由于无法将作为右值的临时变量从左值当中区别出来&#xff0c;所以程序运行时有大量临时变量白白的创建后又立刻销毁&#xff0c;其中又尤其是返回…

BZOJ3930-莫比乌斯反演+杜教筛

题目的意思很简单&#xff0c;求给定区间内的gcdk的个数&#xff0c;这应该是传统的莫比乌斯反演了。 有两种思路&#xff0c;一种是直接将里面变成gcd1&#xff0c;然后里面看作元函数用莫比乌斯函数和恒等函数展开&#xff0c;然后改变求和顺序。 还有一种是构造两个函数&…