题目一道,求算法解答.........

qq120848369 2010-05-22 01:39:20
输入a,n,k(1<=a,n<=1e9 1<=k<=10000 ,
注意:有多组测试数据,请用EOF标志判断结束输入):
2 32 5
2 30 5

输出(a^n)%k的结果(a的n次方被k除的余数):
1
4
...全文
141 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kindlucy 2010-05-22
  • 打赏
  • 举报
回复
我以前写的代码

#include <iostream.h>
#include <stdio.h>
#include <math.h>

//calculate a (mod b)
int calmod(int a,int b)
{
int q=floor(a/b);
q=a-q*b;
return q;
}

//模重复平方法,输出计算的过程
//calculate b^c(mod m)
int calans(int b,int c,int m)
{
int a=1,i=0;
while(c!=0){
if(c%2==1){
a=calmod(a*b,m);
b=calmod(b*b,m);
printf("(%d) n=1,计算\n",i);
printf(" a=a*b=%d, b=b^2=%d (mod %d)\n",a,b,m);
}
if(c%2==0){
a=calmod(a,m);
b=calmod(b*b,m);
printf("(%d) n=0,计算\n",i);
printf(" a=a=%d, b=b^2=%d (mod %d)\n",a,b,m);
}
c=floor(c/2);
i++;
}
return a;
}

int main()
{
int b,c,m;
cout << "please input b^c (mod m):\nb= ";
cin >> b;
cout << "c= "; cin >>c;
cout << "m= "; cin >>m;
printf("%d^%d=%d (mod %d)\n",b,c,calans(b,c,m),m);
}
kindlucy 2010-05-22
  • 打赏
  • 举报
回复
模重复平方法
绿色夹克衫 2010-05-22
  • 打赏
  • 举报
回复
就是PowerMod问题,前段时间还给大家出过这道题,复杂度log(n)的。

我举个例子,如果求2^1024 Mod 11,可以先算出2 mod 11 = 2
4 mod 11 = (2 mod 11)^2 mod 11 = 2 * 2 mod 11 = 4
16 mod 11 = (4 mod 11)^2 mod 11 = 4 * 4 mod 11 = 5
256 mod 11 = (16 mod 11)^2 mod 11 = 5 * 5 mod 11 = 3
65536 mod 11 = (256 mod 11)^2 mod 11 = 3 * 3 mod 11 = 9
......
这样只需要10次就可以推出1024 mod 11的结果

如果求2^1025 mod 11呢?
2^1025 mod 11 = (2^1024 mod 11) * (2 mod 11) mod 11
2^1706 mod 11 = (2^1024 mod 11) * (2^512 mod 11) * (2^128 mod 11) * (2^32 mod 11) * (2^8 mod 11) * (2 mod 11) mod 11
实际上就是1706转化为2进制后逐个乘起来。而整个过程中,这些二进制mod 11的值都被计算过,因此一个循环就可以求出来了
qq120848369 2010-05-22
  • 打赏
  • 举报
回复
意思貌似懂了,代码没弄明白。
if( a > n ) a %= n; 不懂
d = (d*d)%n; 不懂
Sunday 2010-05-22
  • 打赏
  • 举报
回复
}
/*==================================================*
| 大数取模的二进制方法
\*==================================================*
求 a^b mod c
把 b化成二进制串的形式:b = (at at-1 at-2 … a1 a0)
那么有: b = at*2^t + at-1*2^(t-1) + … … + a1*2^1 + a0*
其中 ai=0,1.
则:a^b mod c = a^( at*2^t + at-1*2^(t-1) + … … + a1*2
a0*2^0) mod c = ((a^(a0*2^0) mod c) * a^(a1*2^1) mod c
注意到:a^(2^(i+1))mod c = (a^(2^i) mod c)^2 mod c,这样
以在常数项时间内由2^i项推出2^(i+1)项。 时间复杂度为O((logb)
int mod_exp(int a,int b0,int n)//return a^b0 % n
{
if( a > n ) a %= n;
int i, d = 1, b[35];
for( i=0; i < 35; ++i ){
b[i] = b0%2;
b0 /= 2;
if( b0 == 0 ) break;
} //b[i]b[i-1]...b[0]为 b0的二进制表示
for( ;i >= 0; --i ){
d = (d*d)%n;
if( b[i] == 1 ) d = (d*a)%n;
}
return d;
}
fairywell 2010-05-22
  • 打赏
  • 举报
回复
modexp 算法吧
qq120848369 2010-05-22
  • 打赏
  • 举报
回复
能给出算法描述么,直接看代码看不懂.
knate 2010-05-22
  • 打赏
  • 举报
回复
不是有log n算法吗?
gnefuil 2010-05-22
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<memory.h>
int main() {
int mark[10000], a, n, k, i, v;
while(scanf("%d%d%d",&a,&n,&k)!=EOF) {
memset(mark,-1,sizeof mark);
for (v=a%k, i=1; i<n && mark[v]<0;mark[v]=i++, v=(v*a)%k);
if (i!=n) for (n=(n-1)%(i-mark[v]), v=a, i=0; i<n; i++, v=(v*a)%k);
printf("%d\n", v);
}
return 0;
}
程序员面试金典.Cracking the Coding Interview.第5版 英文版 一书在手,面试机会我有 这本书详细讲解了一般技术公司面试的流程,评价标准设置,最后还有一个章节为你在薪水上讨价还价进行支招。 当然,书中最核心的还是面试中的题目了。本书的题目算法和数据结构为主,但也分别有一个章节涵盖分布式系统设计,c/c++、java、sql、多线程等知识性的内容。所有题目都有解答思路和答案,算法题目的实现使用了java。只要有一点java基础的同学,应该都可以看明白。 书中有一道习题使用了后缀树。后缀树这个特殊的结构在《算法导论》等众多书中都没有出现,可以在网上找到一些计算生物学的课件。很多匹配字符串相关的问题都可以用后缀树或者广义后缀树给出一个线性解法。但注意的是这个数据结构所占用的空间也是很大的。虽然一些情况下可以优化到线性,但这种优化在一些具体的问题中会改变问题的语意,因此不是任何时候都可以适用的。对后缀树和广义后缀树感兴趣可以参考http://book.douban.com/subject/1765938/,网上也可以找到一些相关的课件 书中有”连续子序列最大和值“和”最长递增子序列“这样的题目。但是没有包含”连续子序列最大积值“这样的题目,并且”最长递增子序列“给出的解答不是最优的,这两个题目大家可以额外思考一下,面试中也很常见。 另外,面试过程中也会遇到很多与系统相关的知识性的题目,如流水线、虚拟内存、进程线程、地址空间结构、异常处理、并发编程等等,这些内容可以参考《深入理解计算机系统》http://book.douban.com/subject/5407246/。 网络相关的内容可以参考《TCP/IP详解》卷一http://book.douban.com/subject/1099252/。 一些更具体的内容,如linux启动过程、linux文件系统原理、浏览器访问网址过程等,可以查看wikipedia相关页面,linux相关的内容可以访问鸟哥的私房菜基础篇的相关文章http://linux.vbird.org/linux_basic/

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧