复习时食用,会比较简略。
原理就不讲了,还不会快速幂的先下车吧。
板子最大先来板子。
#10194. 「一本通 6.1 练习 1」A 的 B 次方
目录
#10193. 「一本通 6.1 例 1」序列的第 k 个数
#10194. 「一本通 6.1 练习 1」A 的 B 次方
#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;
}