鱼C论坛

 找回密码
 立即注册
查看: 5531|回复: 11

模运算问题求解

[复制链接]
发表于 2012-12-1 00:49:26 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 殘影 于 2012-12-1 22:26 编辑

Hint:
1、1秒钟内,普通计算机大概处理10^8次运算。题目中的数据量如果用循环语句逐次累加将会使运行时间过长而返回“超时错误” (Time Limit Exceeded)
2.模运算的部分性质
(a + b) % m = (a % m + b % m) % m;
(a * b) % m = ((a % m) * (b % m)) % m;
Input
输入包含多组数据,每组数据包含一个正整数n (1 <= n <= 2*10^8)。
Output
对于每组数据,由于结果可能非常大。输出2的n次方除以100000007取余(就是模100000007)的结果.
Sample Input
5
10
Sample Output
32
1024
这道题该怎么做?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-1 00:49:27 | 显示全部楼层
本帖最后由 仰望天上的光 于 2012-12-1 10:45 编辑
  1. #include <stdio.h>
  2. #define DIVIDE_NUM 100000007

  3. unsigned int get_result( unsigned int n );
  4. int main(void) {
  5.         unsigned int n;
  6.         while( scanf( "%u", &n ) !=EOF )
  7.                 printf("%u\n", get_result(n) );
  8.         return 0;
  9. }

  10. unsigned int get_result( unsigned int n ) {
  11.         if( n < sizeof(unsigned int)*8 )
  12.                 return (1<<n)%DIVIDE_NUM;
  13.         return ( get_result( n>>1 ) * get_result( n - n>>1 ) )%DIVIDE_NUM;
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-1 05:39:01 | 显示全部楼层
又一位纠结专研的朋友……给你顶,不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-1 10:35:54 | 显示全部楼层
使用快速幂,也就是二分可以使时间复杂度降到log2(n)应该就可以过了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-1 11:48:58 | 显示全部楼层
想了半天也没推导出公式,坐等高手指导。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-1 12:43:42 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-1 13:09:03 | 显示全部楼层
殘影 发表于 2012-12-1 12:43
不行哦 这个有错
  1. #include <stdio.h>

  2. #define DIVIDE_NUM 100000007


  3. unsigned int get_result( unsigned int n );

  4. int main(void) {

  5.         unsigned int n;

  6.         while( scanf( "%u", &n ) !=EOF )
  7.                 printf("%u\n", get_result(n) );

  8.         return 0;

  9. }


  10. unsigned int get_result( unsigned int n ) {

  11.         //if( n < sizeof(unsigned int)*8 )
  12.                 if( n < sizeof(unsigned int)*8/2 )
  13.                 return (1<<n)%DIVIDE_NUM;

  14.         return ( get_result( n>>1 ) * get_result( n - n>>1 ) )%DIVIDE_NUM;

  15. }
复制代码
修改一行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-1 13:50:32 | 显示全部楼层
仰望天上的光 发表于 2012-12-1 13:09
修改一行

还是不行 从16次方开始就出错了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-1 14:43:56 | 显示全部楼层
wangyexin 发表于 2012-12-1 10:35
使用快速幂,也就是二分可以使时间复杂度降到log2(n)应该就可以过了

能指教一下嘛?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-1 19:51:04 | 显示全部楼层
我看不到你的回复
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-1 22:27:06 | 显示全部楼层
wangyexin 发表于 2012-12-1 19:51
我看不到你的回复

我说的是让你赐教一下。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-12-2 08:36:48 | 显示全部楼层
  1. a^k%m
  2. long mod(long a,long k,long m)
  3. {
  4.     long b=1;
  5.     while(k>=1)
  6.     {
  7.          if(k%2 == 1)b = a*b%m;
  8.          a = a*a%m;
  9.          k = k/2;
  10.     }
  11.     return b;
  12. }
复制代码
代码没在编译器里运行,不一定能编译通过,但是大体算法就是这样了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-16 16:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表