洛谷——P1630 求和
阿新 • • 發佈:2017-12-02
題目 char etc str ostream ora 滿足 color esp
P1630 求和
題目描述
求1^b+2^b+……+a^b的和除以10000的余數。
輸入輸出格式
輸入格式:
第一行包含一個正整數N,表示共有N組測試數據;
接下來N行,每行包含兩個正整數a和b。
【數據規模】
對於30%的數據中,滿足N<=10,a,b<=1000;
對於100%的數據中,滿足N<=100,a,b<=1000000000;
輸出格式:
共N行,每行一個對應的答案。
輸入輸出樣例
輸入樣例#1: 復制1 2 3輸出樣例#1: 復制
9
快速冪+優化
在我們for循環的時候循環到a是一定不可能的,我們知道在我們取膜的時候a*c%b=a%b*c%b,所以我們利用這個原理,因為是挨著快速乘,他們取膜以後的數也一定是連著的,因此我們直接for循環i位每一個數取膜以後的數,我們還可以知道,當前數如果比a%b小的話,那麽我們就有a./b+1個,反之,就有a/b個
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 10000 using namespace std; int n,a,b,s,ans; int read() { int x=0,f=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=getchar(); return x*f; } int qpow(int a,int b) { int res=1; while(b) { if(b&1) res=1ll*res*a%mod; a=1ll*a*a%mod;b>>=1; } return res; } int main() { n=read(); while(n--) { a=read(),b=read(); s=a/mod;a%=mod;ans=0; for(int i=1;i<=mod;i++) { if(i<=a) ans=(ans+1ll*(s+1)*qpow(i,b)%mod)%mod; else ans=(ans+1ll*s*qpow(i,b)%mod)%mod; } printf("%d\n",ans); } return 0; }
洛谷——P1630 求和