rt,原题https://www.luogu.com.cn/problem/P7108
这道题及其卡常。第一篇题解甚至无法通过。我找到一篇能通过的题解,只要1.95s就能过,而我自己的会直接tle,有没有巨佬可以告诉我两种写法常数差在哪了
以下是题解的
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read()
{
ll ans = 0;
char c = getchar(), last = ' ';
while(c < '0' || c > '9') last = c, c = getchar();
while(c >= '0' && c <= '9') ans = (ans << 1) + (ans << 3) + c - '0', c = getchar();
if(last == '-') ans = -ans;
return ans;
}
const ll mod = 1e9+7;
ll T, a, b, h;
ll qpow(ll x, ll k)
{
ll ans = 1;
while(k)
{
if(k & 1) ans = ans * x % mod;
x = x * x % mod;
k >>= 1;
}
return ans % mod;
}
ll work1()
{
ll x = a, cnt = 0;
x = ((a - 1) * qpow(b, h + 1) % mod - a + b + mod) % mod * qpow(b - 1, mod - 2) % mod;
return x % mod;
}
ll work2()
{
ll x = a, cnt = 0;
x = a * qpow(b, h) % mod;
return x % mod;
}
int main()
{
T = read();
while(T --)
{
a = read(), b = read(), h = read();
if(h == 0) printf("%lld\n", a);
else if(a == b) printf("%lld\n", qpow(a, h + 1) % mod);
else if(b == 1) printf("%lld\n", ((a - 1) * (h + 1) % mod + 1) % mod);
else if(a > b)
{
printf("%lld\n", work1() % mod);
}
else if(a < b)
{
printf("%lld\n", work2() % mod);
}
}
}
以下是我的,快读快写都用上了
#include<bits/stdc++.h>
using namespace std;
typedef long ll;
ll mod=1e9+7;
ll qpow(ll a, ll b, ll m) {
a %= m;
ll res = 1;
while (b > 0) {
if (b & 1) res = res * a % m;
a = a * a % m;
b >>= 1;
}
return res%m;
}
void read(ll &x){
x=0;
char c;
do{
c=getchar();
}while(c<'0'||c>'9');
while(c>='0'&&c<='9'){
x=(x*10+c-'0')%mod;
c=getchar();
}
}
void put(ll x){
char ch[30];
short int cp=-1;
do{
ch[++cp]=x%10+'0';
x/=10;
}while(x>0);
for(short int i=cp;i>=0;i--)putchar(ch[i]);
}
int main(){
ll t,a,b,h;
read(t);
while(t--){
read(a);read(b);read(h);
if(b==1)put(((a-1)*h+a)%mod);
else if(a<=b){
put(a*qpow(b,h,mod)%mod);
}
else{
put((a*qpow(b,h,mod)%mod+(qpow(b,h,mod)-1)*(a-b)%mod*qpow(b-1,mod-2,mod)%mod)%mod);
}
putchar('\n');
}
}
悬一关,救救孩子吧,卡了好久了