离谱的常数(玄关)
  • 板块灌水区
  • 楼主supermzc
  • 当前回复8
  • 已保存回复8
  • 发布时间2025/1/20 20:13
  • 上次更新2025/1/21 01:41:08
查看原帖
离谱的常数(玄关)
1034549
supermzc楼主2025/1/20 20:13

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');
	}
}

悬一关,救救孩子吧,卡了好久了

2025/1/20 20:13
加载中...