1. 程式人生 > >洛谷——P1630 求和

洛谷——P1630 求和

題目 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 求和