李晓东老师的新手入门题题解

3的一万亿次方的第九位数。

这题其实非常简单,直接快速幂取模就好了。

介绍一下位运算,>>右移一位  <<左移一位   &按位与   |按位或   这个东西和计算机在内部存储数据有关,用codeblocks单步调试的话是可以看的,就是你把一个东西写成二进制形式然后运算,比如右移其实就是除二左移就是乘2,&就是判断运算符两边二进制情况下最右边的值是不是都是1,或也同理,书上有可以去慢慢看,挺简单的

#include<bits\stdc++.h>

using namespace std;

long long int MI(long long int a,long long int b)
{
	long long int ans=1,base=a;
	while(b!=0)
	{
		if(b&1!=0)
			ans=ans*base%1000000000;
		base=base*base%1000000000;
		b>>=1;
	}
	return ans;
}
int main()
{
	printf("%lld\n",MI(3,1000000000000));
}

快速幂是我一开始的代码,其实这个代码思路是对的,在64位机sublime里运行是没错的。

 

 

 

之后李老师提供了另两种思路就是用欧拉函数化简原式子第二个思路是10次方的十次方的十次方这么算

欧拉函数,对10的九次方取模,化简之后可以得到,前九位循环节在2的10次方和5的8次方这个地方

#include<bits\stdc++.h>

using namespace std;

long long int MI(long long int a,long long int b)
{
	long long int ans=1,base=a;
	while(b!=0)
	{
		if(b&1!=0)
			ans=ans*base%1000000000;
		base=base*base%1000000000;
		b>>=1;
	}
	return ans;
}
int main()
{
	printf("%lld\n",MI(3,pow(2,10)+pow(5,8)));
}

算出来也是1,则第九位是0;

答案一样

但是很尴尬,这两种方法我都用不了,我的电脑在之前是不支持longlong的,

所以我就手动了大数,建数组模拟乘法

可是算起来可能是一开始数组开的太大了。

 

有些慢,就用了FFt优化,怎么说呢,我学了一个下午,加上今天下午有学霸指导,我才会了一点点
 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值