HDU-1395-2^x mod n = 1(数学题(二次出错))
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1395
这题一定要滴水不漏的把所有代码全部看完。
这个题目是一个数学类型的题,我也没思路,只知道n==1||n%2==0时,x是找不到的,其他则不知道还有没有n存在x是找不到的,
还有一个,暴力搜索时不知道搜到哪里为止,提交,则超时,看了别人的博客:如果a和n互质且a<n则a^x%n=1,因此在此题中,a为2
所以只要a!=1&&a%2!=0,则一定存在x,
#include<stdio.h>
int main(void)
{
int s,n;
while(scanf("%d",&n)==1)
{
if(n%2==0||n==1)
{
printf("2^? mod %d = 1\n",n);
continue;
}
int m=2;
s=1;
int k=0;
for(;;)
{
s=s*m;
k++;
if(s==n+1)
{
printf("2^%d mod %d = 1\n",k,n);
break;
}
if(s>n+1)
s=s%n;//防止数据过大溢出
}
}
return 0;
}
另一种解法
#include<stdio.h>
int main(void)
{
int s,n,i;
int m;
while(scanf("%d",&n)==1)
{
if(n==1||n%2==0)
{
printf("2^? mod %d = 1\n",n);
continue;
}
s=1;
m=2;
for(i=1;i<=n;i++)
{
s=s*m;
if(s%n==1)
break;
s=s%n;//防止溢出;
}
if(i<=n)
printf("2^%d mod %d = 1\n",i,n);
else
printf("2^? mod %d = 1\n",n);
}
return 0;
}
解释
网友问答
为什么是最多执行 n 次呢?不好意思反应不过来^_^
2^k % n 最多只有n种不同结果
之后就会开始循环 所以最多只需要尝试n次,如果有解的话n次以内就有解,n次以内没有解的话再往后面试也不可能有解
第二种的修改
#include<stdio.h>
int main(void)
{
int s,n,i;
int m;
while(scanf("%d",&n)==1)
{
if(n==1||n%2==0)
{
printf("2^? mod %d = 1\n",n);
continue;
}
s=1;
m=2;
for(i=1;i<=n;i++)
{
s=s*m;
if(s%n==1)
break;
s=s%n;
}
if(i<=n)
printf("2^%d mod %d = 1\n",i,n);
//else
//printf("2^? mod %d = 1\n",n);
}
return 0;
}
同样也会过(AC)第一种方法可解释;
以上全是他人的,别人的毕竟是别人的,只有自己的才会更深刻
WA Time Limit Exceeded
#include<stdio.h>
#include<math.h>
int main(void)
{
int s,n,i;
int m;
while(scanf("%d",&n)==1)
{
if(n==1||n%2==0)
{
printf("2^? mod %d = 1\n",n);
continue;
}
s=1;
m=2;
for(i=1;i<=n;i++)
{
s=(int)(pow(2,i));
if(s%n==1)
break;
s=s%n;
}
if(i<=n)
printf("2^%d mod %d = 1\n",i,n);
}
return 0;
}
为什么会 Time Limit Exceeded,主要是s=(int)(pow(2,i));两个方面(一)强制转换耗时,(二)pow函数耗时,导致Time Limit Exceeded。
HDU-1395-2^x mod n = 1(数学题(二次出错))的更多相关文章
- hdu 1395 2^x mod n = 1(暴力题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1395 2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Oth ...
- hdu 1395 2^x mod n = 1 (简单数论)
题目大意: 求出一个最小的x 使得 2的x次方对n取模为1 思路分析: 若要 a*b%p=1 要使得b存在 则 gcd (a,p)=1. 那么我们应用到这个题目上来. 当n为偶数 2^x 也是偶数, ...
- (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)
题目大意:输入一个整数n,输出使2^x mod n = 1成立的最小值K 解题思路:简单数论 1)n可能不能为偶数.因为偶数可不可能模上偶数以后==1. 2)n肯定不可能为1 .因为任何数模上1 == ...
- hdu 1395 2^x mod n = 1 暴力过~~最好学下欧拉定理~~~
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDU——1395 2^x mod n = 1(取模运算法则)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- hdoj 1395 2^x mod n = 1 【暴力】
策略 : 观察可知,1 或者是能被2整除的数都不会求余等于1, 仅仅须要推断一下是不是除1之外的奇数,在依次查找2^x(mod(n)) ? = 1就能够了 难点:假设每次都是在原来的基础上×2 再推断 ...
- HDOJ 1395 2^x mod n = 1
Problem Description Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1. Input ...
- HDU 1395
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1395(欧拉函数)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
随机推荐
- HDU 2897 邂逅明下(巴什博奕变形)
巴什博奕的变形,与以往巴什博奕不同的是,这里给出了上界和下界,原先是(1,m),现在是(p,q),但是原理还是一样的,解释如下: 假设先取者为A,后取者为B,初始状态下有石子n个,除最后一次外其他每次 ...
- PAT1009
多项式乘法 和多项式加法类似,参考之前多项式加法的代码改改就出来了. 主要是注意一下.最大次数应该会有1000000,然后按照乘法规则来,分配率就没有问题 #include<cstdio> ...
- MyBatis基础用法(一)
<select id="getErrorTimes" resultType="Integer"> SELECT ErrorTimes FROM `e ...
- JAVA基础---面向对象
方法的重载Overload: 一个类中可以定义有相同的名字, 参数不同的多个方法. 调用时, 会根据不同的参数选择对应的方法. static: 在数据区, 可以计数,属于类,不属于对象: public ...
- JQuery UI 封装了一些常用模板
1.css 他已经封装了一些css样式,如果不喜欢,可以直接修改. 2.js 他已经封装了对应的js.
- 如何获取app的素材,做出一个高仿的app
第一步:在iTunes中搜索你想要的app,然后点击下载: 下载完成之后右键点击:在Finder中显示 在finder中右键用"归档工具打开" 会显示如下内容: "显示包 ...
- 控制流(swift)
检测API是否可用 if #available(iOS 9, OSX 10.10, *) { // 在 iOS 使用 iOS 9 APIs , 并且在 OS X 使用 OS X v10.10 APIs ...
- JS中Exception处理
程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(exception handlers).如果例外处理代码设计得周全,那么最终呈现给用户的就将是一个友好的界面.否则,就会 ...
- tp框架 使用ajax
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- Mybatis 模糊查询 中文问题
IDE编码:GBK ,换成UTF-8也不行! @Testpublic void testSearchStudents() {logger.info("查询学生(带条件)");Map ...