列表

详情


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)

上一题