蓝桥杯八字求和(java)
【问题描述】
给定正整数 n, 求 1^8 + 2^8 +···+ n^8 mod 123456789 。其中 mod 表示取余。
【输入格式】
输入的第一行包含一个整数 n。
【输出格式】
输出一行,包含一个整数,表示答案。
【样例输入】
2
【样例输出】
257
【样例输入】
987654
【样例输出】
43636805
【评测用例规模与约定】
对于 20% 的评测用例,1≤n≤20。
对于 60% 的评测用例,1≤n≤1000。
对于所有评测用例,1≤n≤1000000。
该方法是采用快速幂的方法解决的,没有使用BigInteger。看到好多博客都是用BigInteger,所以不用BigInteger来试试。思路是1到n对123456789取模,可以先对每个数取模然后相加。然而这样做当n很大时依然会超出范围,所以在进行快速幂中让base对123456789取模,这样就不会超出范围了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
long x=123456789l;
long sum=0l;
for(long i=1l;i<=n;i++) {
sum=sum+fn(i,8)%x;
if(sum>x) {
sum =sum%x;
}
}
System.out.println(sum);
}
//实现快速幂
public static long fn(long base,long pow) {
long ans=1;
while(pow>0) {
if((pow&1)==1) {
ans*=base;
}
base=(base*base)%123456789;
pow>>=1;
}
return ans;
}
}