题目描述
有一天集训队的学弟们正在计算一堆数,但是dreamstart感觉他们算的太慢了,就让他们坐在一起想出一个快速计算的方法,但是由于他们一时想不出来,想让你帮助他们。他们说现在有一个数列,要算出第 i 个数的 i 次幂并且把每个数计算出来的值加到一起,最后答案模10000019。
聪明的你可以帮助他们吗?
输入描述:
第一行有一个整数n,n <= 1e5
接下来一行有n个数,每个数的大小不超过1e16
输出描述:
输出取模之后的和
示例1
输入
4 1 6 9 12
输出
21502
刚开始看到题直觉会超时,但是我还是一往无前的做了(对
然后果然超时了……
除了一直取模之外我也想不到好的办法……QAQ
下面是我copy的大佬的代码
#include <set> #include <map> #include <queue> #include <deque> #include <stack> #include <cmath> #include <cstdio> #include <vector> #include <string> #include <cstring> #include <fstream> #include <iostream> #include <algorithm> using namespace std; #define eps 1e-8 #define pb push_back #define PI acos(-1.0) #define clr(a,b) memset(a,b,sizeof(a) //这边很牛逼的一些声明,感觉就是大佬会用的吧。。下次可以学一下(我找不到原来颜色了,。。这个将就一下吧 #define FAST_IO ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL) typedef long long ll; typedef unsigned long long ull; const ll mod=10000019; ll fast_mod(ll a,ll b){ ll res=1; while(b){ if(b&1) res=(res*a)%mod; //判断b是不是奇数,如果是的话就res乘个a b>>=1; //b除以2 a=(a*a)%mod; //a平方,就因为前面b除以2了嘛,相当于a就除了个平方,所以原数基础上来个平方 } return res; } //这函数简直牛逼啊卧槽,直接把复杂度搞到logn了,传说中的快速幂函数!出现了! int main(){ FAST_IO; ll x,n,ans=0; cin>>n; for(ll i=1;i<=n;i++){ cin>>x; ans=(ans+fast_mod(x,i))%mod; //主函数这边其实没什么亮点,主要就是一个fast_mod函数把答案算出来了 } cout<<ans<<endl; return 0; }
顺带一提const 跟 define的区别
define的话感觉就是单纯的文本声明 直接名称+系统名定义过去了
const是带类型的 所以比较精确一点 比如const ll mod=1000019这种
typedef是个什么东西呢。。我也不是很清楚 这应该是类型声明吧
不过这个好像是先放系统类型再放自定义类型名的 比如typedef long long ll这样 而且这个跟const都是要加分号的
快速幂~学到啦~