欧拉计划48题

Self powers

The series, 1^1 + 2 ^2 +.....+10^{10} =10405071317.

Find the last ten digits of the series, 1^1+2^2+3^3+.....+1000^{1000}.

自幂

自幂级数的前十项求和为1^1 + 2 ^2 +.....+10^{10} =10405071317.

求自幂级数的前一千项求和,即1^1+2^2+3^3+.....+1000^{1000}.,并给出其最后十个数字作为答案。

        这个题目会用到同余定理,

        假如a mod c = d

               b mod c = d

        那么a\equiv b(mod c)

        如果a\equiv b(mod m)   c\equiv d(mod m) 那么

        a + c \equiv d + b (mod m)\\ a - c \equiv b - d (mod m)\\ a * c \equiv d * b (mod m)\\

        在假如a mod c = d 

                   b mod c = e

        带入上面的推导结结果

        a * b  mod c = d * e mod c = (a mod c * b mod c) mod c

        a + b mod c = d + e mod c = (a mod c + b mod c) mod c

        性质1:这可以说明两个数乘积余等于两个数先取余在相乘在取余

        性质2:下面可以说明两个数的和的余等于两个数先取余再相加在取余

        比如10 * 10 mod 10 = ((10 mod 10) * (10 mod 10)) mod 10 = 0

        (10 + 10) mod 10 = ((10 mod 10) + (10 mod 10)) mod 10 = 0

        所以有了这两个结论,就不用再去创建大整数来实现这个题目了,下面的代码实现:

#include 


long long mod = 1e10;

int main() {
    long long ans = 0;
    for (int i = 1; i <= 1000; i++) {
        long long sum = 1;
        for (int j = 1; j <= i; j++) {
            sum = (i * sum) % mod;//性质1
        }
        ans = (ans + sum) % mod;//性质2
    }
    printf("%lld\n", ans);
    return 0;
}

 最终答案:9110846700

你可能感兴趣的:(算法)