luoguP1045 (Java大数)
2024-09-04 09:10:56
题目链接:https://www.luogu.org/problemnew/show/P1045
题意:给定p(1000<p<3100000),求2^p-1的位数和最后500位(若不足高位补零)。
思路:首先,2^p-1和2^p有相同的位数,因为2^p末位一定不为0。所以2^p-1的位数为log10(2^p)+1,即p*log10(2)+1。
手写快速幂计算2^p,并对Mod=10^500取模,计算结果减一之后注意判断是否为负,若为负,则加上模数,之后将BigInteger转字符串输出即可。
代码:
import java.io.*;
import java.math.*;
import java.util.*; public class Main {
public static BigInteger qpow(BigInteger a,int b,BigInteger Mod)
{
BigInteger ans = BigInteger.ONE;
while(b!=0)
{
if((b&1)==1)
ans = ans.multiply(a).mod(Mod);
a = a.multiply(a).mod(Mod);
b >>= 1;
}
return ans;
}
public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
BigInteger two = BigInteger.valueOf(2);
int p = cin.nextInt();
BigInteger Mod=BigInteger.TEN.pow(500);
BigInteger tmp = qpow(two,p,Mod);
tmp = tmp.subtract(BigInteger.ONE);
if(tmp.compareTo(BigInteger.ZERO)<0)
tmp.add(Mod);
String s=tmp.toString();
int len=s.length();
int cnt=0;
System.out.println((int)(p*Math.log10(2)+1));
for(int i=1;i<=500-len;++i){
System.out.print('0');
cnt++;
if(cnt==50){
cnt=0;
System.out.println();
}
}
for(int i=0;i<len;++i){
System.out.print(s.charAt(i));
cnt++;
if(cnt==50){
cnt=0;
System.out.println();
}
}
}
}
最新文章
- angularjs自动化测试系列之jasmine
- commons-math使用
- js 小工具-- 按长度截取字符串
- 2.5 ListView
- 纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦
- FineUI第二天
- Vector3.Lerp 插值
- Java 基本数据类型 sizeof 功能【转】
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
- .net 创建属于自己的log类
- java String 两种不同的赋值 比较
- POJ 3449 Geometric Shapes (求正方形的另外两点)
- JavaWeb 后端 <;十一>; 之 DBUtils 框架 (基本使用 结果集 事务处理 对表读取)
- 前端笔记---塌陷top
- React框架 dva 和 mobx 的使用感受
- Django中Middleware中间件
- Synchronized的那些事
- BZOJ.2287.[POJ Challenge]消失之物(退背包)
- bootStrap中的ul导航2
- Adapter中用不了getWindowManager()