主题:[讨论]很难的线性代数问题
论坛爱好者
[专家分:0] 发布于 2010-07-14 10:16:00
题目描述:
输入:多组测试数据,每组一行,每组数据给出三个long long范围(1e19)内的正整数a,n,k
输出:输出a的n次方被k除的余数
样例输入:
2 32 1000
3 9 100
样例输出:
296
83
回复列表 (共21个回复)
11 楼
cgl_lgs [专家分:21040] 发布于 2010-07-15 14:10:00
呵呵,原来你是周星星啊~~~~~
12 楼
论坛爱好者 [专家分:0] 发布于 2010-07-15 18:19:00
我没有 GNU GCC compiler软件,用的是VC++
请问 GNU GCC compiler在什么地方可以下载,我的操作系统能够是XP.
13 楼
强强 [专家分:4740] 发布于 2010-07-15 18:52:00
#include <stdio.h>
int main(int argc,char *argv[])
{
unsigned long Sum=2;
for(int i=0;i<31;i++)//i<31算的是32次方
{
Sum*=2;
if(Sum>=1000)
{
Sum-=1000;
}
}
printf("%d",Sum);
return 0;
}
这样也得出了296,试验几个别的数次方也正确,具体的数学原理我不太清楚,问下大家这种方法得出的296是有数学依据的还是碰上的?
15 楼
cracker007 [专家分:22140] 发布于 2010-07-15 23:43:00
请楼主下次不要用这种标题。这是数论里基础的不能再基础的了。
[quote]#include <stdio.h>
int main(int argc,char *argv[])
{
unsigned long Sum=2;
for(int i=0;i<31;i++)//i<31算的是32次方
{
Sum*=2;
if(Sum>=1000)
{
Sum-=1000;
}
}
printf("%d",Sum);
return 0;
}
这样也得出了296,试验几个别的数次方也正确,具体的数学原理我不太清楚,问下大家这种方法得出的296是有数学依据的还是碰上的?[/quote]
当然是有数学依据。同余最基础的一条性质:
若
a==b (mod n), c==d (mod n),
则
ac==bd (mod n)
回到原题,举个例子:
若已经算出
2^31==648 (mod 1000), 2^1==2 (mod 1000),
则可知
2^32==2^31*2^1==648*2==1296==296 (mod 1000)
而2^31 mod 1000又可以根据同样的道理由2^30 mod 1000计算出来。如此往复,最终归结到算2^2 mod 1000。即:
2^32==((2^2 mod 1000)^2 mod 1000)...) (mod 1000)
你所给的代码的数学背景就是如此。还不明白那就请看离散数学的数论基础章节。
16 楼
强强 [专家分:4740] 发布于 2010-07-16 00:05:00
厉害......
17 楼
论坛爱好者 [专家分:0] 发布于 2010-07-16 12:50:00
2楼的程序代码.我用Dev-c++来编译运行,为什么运行程序一闪,就没了,是什么地方的问题呢?
18 楼
kunting [专家分:0] 发布于 2010-07-16 14:08:00
我是来感受一下牛人风采的,我要好好学习
19 楼
Screenager [专家分:840] 发布于 2010-07-16 21:05:00
[quote]我没有 GNU GCC compiler软件,用的是VC++
请问 GNU GCC compiler在什么地方可以下载,我的操作系统能够是XP.
[/quote]
http://downloads.sourceforge.net/codeblocks/codeblocks-8.02mingw-setup.exe
以上地址下载的codeblocks IDE包含了MinGW它(内嵌了GCC编辑器和gdb调试器)
20 楼
alweeq86 [专家分:1170] 发布于 2010-07-17 23:13:00
[quote]#include <stdio.h>
int main(int argc,char *argv[])
{
unsigned long Sum=2;
for(int i=0;i<31;i++)//i<31算的是32次方
{
Sum*=2;
if(Sum>=1000)
{
Sum-=1000;
}
}
printf("%d",Sum);
return 0;
}
这样也得出了296,试验几个别的数次方也正确,具体的数学原理我不太清楚,问下大家这种方法得出的296是有数学依据的还是碰上的?[/quote]
你这是Sum对1000求余啊 Sum>1000 余是Sum-1000
Sum<1000 余还是Sum
[code=c]
我的算法和你的有类似之处
int GetMode(int a, int n, int k)
{
int mode=1;
for (int i=0;i<n;++i)
{
mode=mode*a%k;
}
return mode;
}
[/code]
我来回复