[题解]斐波那契的最小公倍数
题解
直接算每个质数的指数,对于每个质数 ,设 表示斐波那契数列的 含有 多少。
发现是 向 的容斥:
设在 中选择 个数,他们的 是 的方案数为 ,是 的倍数的方案数为 ,那么显然有
而我们要求的是
专注于指数的运算:
设 中 的倍数有 个,那么 ,继续
显然 ,因此可以将后面的东西改一下
注意到 ,因此 ,所以
对于每一个 ,都计算一下它头顶上的系数,直接暴力枚举 就行了,因为这是 的,其中 .
参考代码
/** @author __Elaina__ */
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("inline")
// #define GCC optimize(2)
// #define GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
// #define USING_FREAD
// #define NDEBUG
#include <cassert>
namespace Elaina {
/** その可憐な少女は魔女であり、旅人でした。 ―― そう、私です! */
#define rep(i, l, r) for(int i = (l), i##_end_ = (r); i <= i##_end_; ++i)
#define repf(i, l, r) for (int i = (l), i##_end_ = (r); i < i##_end_; ++i)
#define drep(i, l, r) for(int i = (l), i##_end_ = (r); i >= i##_end_; --i)
#define fi first
#define se second
#define mp(a, b) make_pair(a, b)
#define Endl putchar('\n')
#define whole(v) ((v).begin()), ((v).end())
#define bitcnt(s) (__builtin_popcount(s))
/** @warning no forced type conversion */
#define rqr(x) ((x) * (x))
#define y0 FUCK_UP
#define y1 MOTHER_FUCKER
#define masdf(...) fprintf(stderr, __VA_ARGS__)
typedef long long ll;
typedef unsigned long long ull;
typedef std::pair<int, int> pii;
typedef vector<int> vset;
template<class T> inline T fab(T x) { return x < 0 ? -x : x; }
template<class T> inline void chkmin(T& x, const T rhs) { x = std::min(x, rhs); }
template<class T> inline void chkmax(T& x, const T rhs) { x = std::max(x, rhs); }
#ifdef USING_FREAD
inline char qkgetc() {
# define BUFFERSIZE 1 << 20
static char BUF[BUFFERSIZE], *p1 = BUF, *p2 = BUF;
return p1 == p2 && (p2 = (p1 = BUF) + fread(BUF, 1, BUFFERSIZE, stdin), p1 == p2) ? EOF : *p1++;
# undef BUFFERSIZE
}
# define CHARRECEI qkgetc()
#else
# define CHARRECEI ((char)getchar())
#endif
template<class T> inline T readret(T x) {
x = 0; int f = 0; char c;
while (!isdigit(c = CHARRECEI)) if(c == '-') f = 1;
for (x = (c ^ 48); isdigit(c = CHARRECEI); x = (x << 1) + (x << 3) + (c ^ 48));
return f ? -x : x;
}
template<class T> inline void readin(T& x) {
x = 0; int f = 0; char c;
while (!isdigit(c = CHARRECEI)) if (c == '-') f = 1;
for (x = (c ^ 48); isdigit(c = CHARRECEI); x = (x << 1) + (x << 3) + (c ^ 48));
if (f) x = -x;
}
template<class T, class... Args> inline void readin(T& x, Args&... args) {
readin(x), readin(args...);
}
template<class T> inline void writln(T x, char c = '\n') {
if (x < 0) putchar('-'), x = -x;
static int __stk[55], __bit = 0;
do __stk[++__bit] = x % 10, x /= 10; while (x);
while (__bit) putchar(__stk[__bit--] ^ 48);
putchar(c);
}
template<class T> inline T listMax(const T& x) { return x; }
template<class T, class... Args> inline T listMax(const T& x, const Args&... args) {
return max(x, listMax(args...));
}
template<class T> inline T listMin(const T& x) { return x; }
template<class T, class... Args> inline T listMin(const T& x, const Args&... args) {
return min(x, listMin(args...));
}
} // namespace Elaina
using namespace Elaina;
const int Maxn = 1e6;
const int mod = 1e9 + 7;
inline int qkpow(int a, int n) {
int ret = 1;
for (; n > 0; n >>= 1, a = (int)(1ll * a * a % mod))
if (n & 1) ret = (int)(1ll * ret * a % mod);
return ret;
}
int a[Maxn + 5], n;
int cnt[Maxn + 5], buc[Maxn + 5];
bool vis[Maxn + 5];
int prime[Maxn + 5], mu[Maxn + 5];
inline void sieve() {
vis[1] = true, mu[1] = 1;
rep (i, 2, Maxn) {
if (!vis[i]) prime[++*prime] = i, mu[i] = -1;
for (int j = 1; j <= *prime && i * prime[j] <= Maxn; ++j) {
vis[i * prime[j]] = true;
if (i % prime[j] == 0) { mu[i * prime[j]] = 0; break; }
mu[i * prime[j]] = -mu[i];
}
}
}
signed main() {
readin(n);
rep (i, 1, n) ++buc[readret(1)];
rep (i, 1, Maxn)
for (int j = i; j <= Maxn; j += i)
cnt[i] += buc[j];
sieve();
int fl = 0, fc = 1, ans = 1, tmp;
rep (i, 1, Maxn) {
int p = 0;
for (int d = i; d <= Maxn; d += i) if (cnt[d] > 0) p += mu[d / i];
if (p < 0) tmp = qkpow(fc, mod - 2), p = -p;
else tmp = fc;
ans = (int)(1ll * ans * qkpow(tmp, p) % mod);
tmp = (fl + fc) % mod, fl = fc, fc = tmp;
}
writln(ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现