码迷,mamicode.com
首页 > 其他好文 > 详细

dreamstart 的催促

时间:2019-01-24 23:05:50      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:一个   prope   -o   info   orange   lis   code   label   script   

技术分享图片 dreamstart 的催促
序号:#120难度:困难时间限制:1000ms内存限制:10M

描述

有一天集训队的学弟们正在计算一堆数,但是 dreamstart 感觉他们算的太慢了,就让他们坐在一起想出一个快速计算的方法,但是由于他们一时想不出来,想让你帮助他们。他们说现在有一个数列,要算出第 i 个数的 i^iii 次幂并且把每个数计算出来的值加到一起,最后答案模 10000019。

聪明的你可以帮助他们吗?

输入

 

第 1 个数字为整数n,1<=n<=10^5

余下 n 个数,每个数的大小不超过10^15

 

输出

 

输出取模之后的和

 

输入样例

4 1 6 9 12

输出样例

3776019

 

 快速幂取摸加欧拉降幂

指数爆炸的时候就要降幂

就是求a^b mod c

可以转化为

a^(b mod phi(c)+phi(c)) mod c

phi 为 欧拉函数

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define mod 4218984
 4 using namespace std;
 5 const int MAXN = 1e5+10;
 6 const int MOd = 10000019;
 7 
 8 LL a[MAXN];
 9 int n;
10 // ll phi( ll n ) { //欧拉函数
11 //     ll ans = n;
12 //     for( ll i = 2; i*i <= n; i ++ ) {
13 //         if( n%i == 0 ) {
14 //             ans -= ans/i;
15 //             while( n%i == 0 ) {
16 //                 n /= i;
17 //             }
18 //         }
19 //     }
20 //     if( n > 1 ) {
21 //         ans -= ans/n;
22 //     }
23 //     return ans;
24 // }
25 
26 LL quick(LL a,LL x, LL MOD){
27     LL r = 1;
28     while(x>0){
29         if (x&1){
30             r = (r*a)%MOD;
31             x--;
32         }
33         a = a%MOD*a%MOD;
34         x>>=1;
35     }
36     return r%MOD;
37 }
38 
39 int main(){
40     scanf("%d",&n);
41     for (int i = 0;i<n;i++)
42         scanf("%lld",&a[i]);
43     LL sum = 0;
44     for (int i = 0;i<n;i++){
45 //  a^(b mod phi(c)+phi(c)) mod c
46         LL ans = (i+1)%mod + mod;
47         LL tmp = quick(i+1, ans, MOd-1)%(MOd-1);
48         sum = (sum + quick(a[i],tmp + MOd-1, MOd))%MOd;
49     }
50     printf("%lld\n",sum);
51     return 0;
52 }

 

 

dreamstart 的催促

标签:一个   prope   -o   info   orange   lis   code   label   script   

原文地址:https://www.cnblogs.com/zllwxm123/p/10317137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!