4391: 赛车在哪里
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 581 Solved: 171
Description
仓鼠家里有一个周长为L的顺时针圆环形赛车轨道,赛车第i秒的平均速度是第i-1秒平均速度的2倍多5,即vi=2*vi-1+5,已知第一秒的平均速度是整数a,求第n秒结束那一刻后赛车所在位置的坐标。
圆形轨道的坐标从起点开始顺时针标为0,1,2,3…L-1
Input
第一行有一个整数T,代表接下来将有T组数据。
每组数据占一行,有三个整数a,n,L。(0<=a<=100,0<=n<=10^9,1<=L<=10^5)
Output
输出一个整数,代表粒子在第n秒结束那一刻所在的位置
Sample Input
3 10 1 1000 10 2 100 2 6 10
Sample Output
10 35 1
HINT
Source
#include<iostream>
#include<cstdio>
#define LL long long
using namespace std;
LL a,b,c;
LL qpow(LL x,LL k)
{
LL tem=1LL;
while(k)
{
if(k&1)
tem=(tem*x)%c;
x=(x*x)%c;
k>>=1;
}
return tem;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld",&a,&b,&c);
LL ans=(((a+5)*((qpow(2,b)%c-1)))%c-(5*b)%c)%c;
printf("%lld\n",(ans+c)%c);
}
}
一开始看到n很大,就想到用矩阵快速幂求,结果走上了一天不归路...
后来也往等比数列上想了,无奈退出来的还是一个sn=2*sn-1+5n+..之类的
后来问了一下学长 ,的确是等比数列
an+5 = 2(an-1+5)
所以
设 sn = a1+ a2 +...+an
则 sn= (a1+5)*(2^n-1)-5*n
于是直接用快速幂就可以求解了