这是我的代码?我 TLE ? 我就是按照第一篇题解的思路打的啊???(由于看不懂第一篇题解的代码所以只好自己打
我试过了,
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;
}
蒟蒻求助 QAQ