?TLE?
查看原帖
?TLE?
747401
dfs0ms楼主2023/1/30 14:28

这是我的代码?我 TLETLE ?? 我就是按照第一篇题解的思路打的啊???(由于看不懂第一篇题解的代码所以只好自己打

记录

我试过了,

int inf = 1314 * mod;

这样稍微快一点,差不多都 60,70 分的样子,为什么我 TLE 啊

代码:自认为码分好看

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <unordered_map>
#define int long long
using namespace std;
const int N = 30000010;

struct gjd
{
	int a[N], cnt;
	void scan()
	{
		char c;
		while (scanf("%c", &c) && ('0' <= c && c <= '9')) { a[++cnt] = c - '0'; }
		for (int i = 1; i <= cnt / 2; i++) swap(a[i], a[cnt - i + 1]);
	}
	int div(int x) /// 返回 a % x
	{
		for (int i = cnt; i >= 2; i--) { a[i - 1] += (a[i] % x) * 10; a[i] /= x; }
		return a[1] % x;
	}
} n;
int mod;

struct matrix
{
	int a[4][4];
	void clear() { memset(a, 0, sizeof(a)); }
	void mul(matrix* b)
	{
		int tmp[4][4]; memset(tmp, 0, sizeof(tmp));
		for (int i = 1; i <= 2; i++)
			for (int j = 1; j <= 2; j++)
				for (int k = 1; k <= 2; k++)
				{
					tmp[i][j] += a[i][k] * b->a[k][j];
					tmp[i][j] %= mod;
				}
		for (int i = 1; i <= 2; i++)
			for (int j = 1; j <= 2; j++) a[i][j] = tmp[i][j];
	}
};
int get(int x) /// 获取 f[x]
{
	matrix ret, base; ret.clear(); base.clear();
	ret.a[1][1] = ret.a[2][2] = 1;
	base.a[1][1] = 0; base.a[1][2] = 1;
	base.a[2][1] = 1; base.a[2][2] = 1;
	x--; while (x)
	{
		if (x & 1) ret.mul(&base);
		base.mul(&base); x >>= 1;
	}
	return (ret.a[1][1] + ret.a[2][1]) % mod;
}

unordered_map<int, int> mp; /// mp[k] 表示 (f[i] << 31) | f[i + 1] 为 k 的 i 是多少
int len; /// 循环节长度

signed main()
{
	srand(time(0));
	n.scan(); scanf("%lld", &mod);
	int inf = 1314 * mod;
	int base = 1; for (int i = 1; i <= 31; i++) base = base << 1;
	while (true)
	{
		int cho = rand() % inf; int f1 = get(cho), f2 = get(cho + 1);
		int tmp = f1 * base + f2;
		if (mp[tmp] != 0) { len = cho - mp[tmp]; if (len == 0) continue; break; }
		mp[tmp] = cho;
	}
	if (len < 0) len = -len;
	int x = n.div(len);
	int res = get(x); printf("%lld", res);
	return 0;
}

蒟蒻求助 QAQQAQ

2023/1/30 14:28
加载中...