24小时热门版块排行榜    

查看: 2240  |  回复: 30
本帖产生 1 个 程序强帖 ,点击这里进行查看
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

wangww2011

木虫 (著名写手)

[交流] Project Euler 48 欧拉工程 48 题 已有5人参与

已知 1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317
请问1^1 + 2^2 + 3^3 + ... + 1000^1000的后十位是多少?
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+3, 程序强帖+1): 鼓励交流! 2011-09-09 23:29:03
引用回帖:
27楼: Originally posted by huycwork at 2011-09-08 22:27:37:
多项式拟合的主要问题是确定最高项~

这个好办

对于一个给出长度为n的序列,先待定最高项次数为n-1就好了嘛,这样必存在一个解。举个简答的例子
CODE:
n      1   2   3
a(n)   1   2   3

可以令a(n) = a2*n^2 + a1*n + a0

然后再代入上面3个数,恰好得到3元一次方程组(其中A为3x3矩阵,a(n)为列向量)

A * [a2 a1 a0]' = a(n)

CODE:
[1 1 1]    [a2]     [1]
[4 2 1] *  [a1]  =  [2]
[9 3 1]    [a0]     [3]

这样就必有且只有一组解[a2 a1 a0]'=[0 1 0]'了,也就是得出a(n)=n

扩展一下,从矩阵A上看:
CODE:
1          1    ...  1  1
2^(n-1) 2^(n-2) ... 2^1 1
3^(n-1) 3^(n-2) ... 3^1 1
..........................
n^(n-1) n^(n-2) ... n^1 1

列与列之间是指数关系,容易得各列都线性无关,所以A必满秩,故对于一般情况:

A * [a[n-1] ... a[1] a[0]]' = a(n)

必有且只有一组解,综上所述,对于任何一个给定序列,只要用这种万能的方法,无论在什么地方给空,随便在空里面填任意的数(整数),都可以找到一个完美的多项式拟合公式!


PS:要是小木虫支持matjax就完美了http://www.mathjax.org/

[ Last edited by sudo on 2011-9-9 at 14:17 ]
29楼2011-09-09 14:13:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 31 个回答

tieer

木虫 (正式写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
xzhdty(金币+1): 欢迎常来讨论 2011-09-07 16:44:22
暴力这个当然简单,
python
CODE:
print sum([i**i for i in xrange(1,1001)])%10000000000

后十位:9110846700

[ Last edited by tieer on 2011-9-7 at 13:59 ]
思考,让这个世界更有趣。
2楼2011-09-07 13:56:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

tieer

木虫 (正式写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
余泽成(金币+2): 鼓励交流,欢迎常来程序语言版! 2011-09-09 23:20:49
或者这样快点
CODE:
print sum([(i**i)%10000000000 for i in xrange(1,1001)])%10000000000

思考,让这个世界更有趣。
3楼2011-09-07 14:02:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sudo

木虫 (正式写手)

★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
xzhdty(金币+2): 欢迎常来讨论 2011-09-07 16:44:51
因为
(a*b)%n == ((a%n)*(b%n))%n
CODE:
#include

int main()
{
    unsigned int i, j;
    unsigned long long sum=0, tmp;
    const unsigned long long k=10000000000ULL;
    for(i=1; i<=1000; i++){
        tmp=i;
        for(j=1; j             tmp *= i;
            tmp %= k;
        }
        sum += tmp;
    }

    printf("%010I64u\n", sum%k);

    return 0;
}

4楼2011-09-07 16:29:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见