LOJ 一本通提高篇6.1快速幂 例题+练习

博客围绕几道算法题展开,包括求序列第k个数、A的B次方、转圈游戏和越狱问题。介绍了各题的题目大意,如判断等差或等比序列求第k项、求幂取模等,还给出了题目分析思路,如利用等差等比公式、快速幂等,最后附上代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复习时食用,会比较简略。

原理就不讲了,还不会快速幂的先下车吧。

板子最大先来板子。

#10194. 「一本通 6.1 练习 1」A 的 B 次方 


目录

#10193. 「一本通 6.1 例 1」序列的第 k 个数

#10194. 「一本通 6.1 练习 1」A 的 B 次方

#2608. 「NOIP2013」转圈游戏

#10196. 「一本通 6.1 练习 3」越狱


#10193. 「一本通 6.1 例 1」序列的第 k 个数

题目

题目大意

给你序列的前三项,这个序列要么是等差序列,要么是等比序列。

求出第k项的值。对200907取模。

对于全部数据,1<=t<=100,1<=a<=b<=c<=10^9,1<=k<=10^9。

题目分析

来自百度的问候:等差数列等比数列

听名字就知道了ba。

等差即两个数之间的差相等,等比即两个数之间的比相等。

等差数列:末项=首项+(项数-1)×公差。

等比数列:末项=首项×比值^(项数-1)。

以上。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int tt,mod=200907;
long long a,b,c,x;

int main()
{
	scanf("%d",&tt);
	while(tt--)
	{
		scanf("%lld%lld%lld%lld",&a,&b,&c,&x);
		if((a+c)==(2*b)) printf("%lld\n",(a+((b-a)*(x-1)%mod))%mod);//等差数列
		else//等比数列
		{
			long long t=a; a=b/a,b=x-1;
			while(b)
			{
				if(b%2) t=t*a%mod;
				a=a*a%mod; b/=2;
			}
			printf("%lld\n",t);
		}
	}
	return 0;
}

 

#10194. 「一本通 6.1 练习 1」A 的 B 次方

题目

题目大意

求a^b mod m的值。

对于全部数据,1<=a,b,m<=10^9。

题目分析

板板子。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

long long a,b,m;

int main()
{
	scanf("%lld%lld%lld",&a,&b,&m);
	long long t=1;
	while(b)
	{
		if(b%2) t=t*a%m;
		a=a*a%m; b/=2;
	}
	printf("%lld",t);
	return 0;
}

 

#2608. 「NOIP2013」转圈游戏

题目

题目大意

n个小伙伴围坐一圈玩游戏。

每一轮第0号位置上的小伙伴顺时针走到第m号位置,第1号位置小伙伴走到第m+1号位置……

依此类推。

现在进行了10^k轮,问x号小伙伴走到了第几号位置。

对于30%的数据,0<k<7;

对于80%的数据,0<k<10^7;

对于100%的数据,1<n<10^6,0<m<n,1<=x<=n,0<k<10^9。

题目分析

为什么不好好坐着???

所以0号小伙伴的走位就是m×10^k%n嘛。

0号小伙伴已经推出来了,x号小伙伴的位置还会远吗。(雾)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

long long n,m,k,x;

int main()
{
	scanf("%lld%lld%lld%lld",&n,&m,&k,&x);
	long long t=1,a=10;
	while(k)
	{
		if(k%2) t=t*a%n;
		a=a*a%n; k/=2;
	}
	t=t*m%n; x+=t;
	if(x>=n) x-=n;
	printf("%lld",x);
	return 0;
}

 

#10196. 「一本通 6.1 练习 3」越狱

题目

题目大意

有n个房间,m种宗教,每个人可能信仰其中一种。

如果相邻房间的信仰的宗教相同,就可能发生越狱。

求有多少种状态可能发生越狱。

对于全部数据,1<=m<=10^8,1<=n<=10^12。

题目分析

所有的可能宗教信仰 M^N:有N个监狱,每个监狱的犯人的宗教有M种选择。

不能越狱的情况:M*(M-1)^(N-1)。

第一个监狱里的犯人可有M个宗教选择;

第二个监狱里的犯人可有M-1个宗教选择(要求与第一个监狱里的犯人宗教不同)。

以此类推。

共N个监狱,除第一个监狱有M个选择,其余N-1个监狱只有M-1中选择,即M*(M-1)^(N-1)。

ans=[M^N-M*(M-1)^(N-1)]%100003。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

long long m,n,mod=100003;

int main()
{
	scanf("%lld%lld",&m,&n);
	long long mm=m,nn=n,k=1;
	while(nn)
	{
		if(nn%2) k=k*mm%mod;
		mm=mm*mm%mod; nn/=2;
	}
	long long nnn=n-1,mmm=m-1,kk=1;
	while(nnn)
	{
		if(nnn%2) kk=kk*mmm%mod;
		mmm=mmm*mmm%mod; nnn/=2;
	}
	kk=kk*m%mod;
	long long ans=(k+mod-kk)%mod;
	printf("%lld",ans);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值