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 ...
随机推荐
- 近期用过的Linux口令备份
最近使用Ubuntu用到的一些口令: rm -rf directory 移除文件夹或者文件touch (create file)mkdirmv(move,rename)chown (change ow ...
- 转:从web三层架构解析软件测试内容
B/S架构的系统,都会使用如下的基础软件架构: 数据访问层:实现对数据的访问功能,如增加.删除.修改.查询数据. 业务逻辑层:实现业务的具体逻辑功能,如学生入学.退学.成绩管理等. 页面显示层:将业务 ...
- android异步加载AsyncTask
http://blog.csdn.net/abc5382334/article/details/17097633 http://keeponmoving.iteye.com/blog/1515611 ...
- fopen()函数中参数mode的取值
FILE * fopen(const char * path,const char * mode); 参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存 ...
- Quartz定时调度
测试类 import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; ...
- 基于I2C EPPRPM(AT24C02B) + LCD12864实验
本次实验目的:在指定的EPPROM地址中,写入一数据,延时100MS后,在从该地址中读取,并在LCD上显示. 该实验在前两天就开始做了,一开始并没有成功,读出的一直0x00,当时也调了一会,但跳回到P ...
- js优化原则
首先,与其他语言不同,JS的效率很大程度是取决于JS engine的效率.除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化的策略.例如FF.Opera和Safari的JS引擎,都对字 ...
- Fox And Two Dots
B - Fox And Two Dots Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...
- ural1628 White Streaks
White Streaks Time limit: 1.0 secondMemory limit: 64 MB The life of every unlucky person has not onl ...
- nginx 内存池分析
最近nginx的源码刚好研究到内存池,这儿就看下nginx内存池的相关的东西. 一,为什么要使用内存池 大多数的解释不外乎提升程序的处理性能及减小内存中的碎片,对于性能优化这点主要体现在: (1)系统 ...