回 帖 发 新 帖 刷新版面

主题:[讨论]很难的线性代数问题

题目描述:

输入:多组测试数据,每组一行,每组数据给出三个long long范围(1e19)内的正整数a,n,k
输出:输出a的n次方被k除的余数

样例输入:
2 32 1000
3 9 100

样例输出:
296
83

回复列表 (共21个回复)

11 楼

呵呵,原来你是周星星啊~~~~~

12 楼

我没有 GNU GCC compiler软件,用的是VC++
请问 GNU GCC compiler在什么地方可以下载,我的操作系统能够是XP.

13 楼

#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是有数学依据的还是碰上的?

14 楼

顶顶顶顶顶顶顶顶顶顶顶~~~

15 楼

请楼主下次不要用这种标题。这是数论里基础的不能再基础的了。

[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 楼

厉害......

17 楼

2楼的程序代码.我用Dev-c++来编译运行,为什么运行程序一闪,就没了,是什么地方的问题呢?

18 楼

我是来感受一下牛人风采的,我要好好学习

19 楼

[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 楼

[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]

我来回复

您尚未登录,请登录后再回复。点此登录或注册