NC21856. dreamstart的催促
描述
有一天集训队的学弟们正在计算一堆数,但是dreamstart感觉他们算的太慢了,就让他们坐在一起想出一个快速计算的方法,但是由于他们一时想不出来,想让你帮助他们。他们说现在有一个数列,要算出第 i 个数的 i 次幂并且把每个数计算出来的值加到一起,最后答案模10000019。
聪明的你可以帮助他们吗?
输入描述
第一行有一个整数n,n <= 1e5
接下来一行有n个数,每个数的大小不超过1e16
输出描述
输出取模之后的和
示例1
输入:
4 1 6 9 12
输出:
21502
C(clang 3.9) 解法, 执行用时: 33ms, 内存消耗: 356K, 提交时间: 2019-01-01 17:23:35
#include<stdio.h> int main() { long n,i,a,b,j,s=0; scanf("%ld",&n); for(i=1;i<=n;i++) { scanf("%ld",&a); b=1; for(j=i;j>0;j/=2,a=a*a%10000019) { if(j%2==1) b=b*a%10000019; } s=(s+b)%10000019; } printf("%ld\n",s); return 0; }
pypy3 解法, 执行用时: 204ms, 内存消耗: 34944K, 提交时间: 2021-12-03 19:56:44
mod = 10000019 def qpow(a, b) : ret = 1 while b != 0 : if b & 1 : ret = ret * a % mod b >>= 1 a = a * a % mod return ret n = int(input()) ans = 0 a = list(map(int, input().split())) for i in range(0, n) : ans = (ans + qpow(a[i], i + 1)) % mod print(ans)
C++11(clang++ 3.9) 解法, 执行用时: 58ms, 内存消耗: 484K, 提交时间: 2020-02-27 13:25:47
#include<iostream> #define M 10000019 using namespace std; int main() { long long n,a,c=1,ans=0; cin>>n; for(int i=1;i<=n;i++) { cin>>a; int j=i; while(j) { if(j&1) c=c*a%M; a=a*a%M; j/=2; } ans+=c%M; c=1; ans%=M; } cout<<ans<<endl; return 0; }
Python3(3.5.2) 解法, 执行用时: 414ms, 内存消耗: 13624K, 提交时间: 2018-12-30 12:43:41
n = eval(input()) a = list(map(int,input().split())) s = 0 M = 10000019 for i in range(n): s += pow(a[i],i + 1,M) print(s % M)