题面

令 \({(1+\sqrt 2)}^n=e(n)+f(n)*\sqrt2\) ,其中 \(e(n),f(n)\) 都是整数,显然有 \({(1-\sqrt 2)}^n=e(n)-f(n)*\sqrt 2\) 。

令 \(g(n)\) 表示 \(f(1),f(2)…f(n)\) 的最小公倍数,给定两个正整数 \(n\) 和 \(p\) ,其中 \(p\) 是质数,并且保证 \(f(1),f(2)…f(n)\) 在模 \(p\) 意义下均不为 \(0\) .

请计算\(\displaystyle \sum_{i=1}^{n} i*g(i)\) .其在模 \(p\) 的值。

\(T \le 210, \sum n \le 3 \times 10^6\)

题解

其实它就是给你了 \(f(n)\) 的特征方程,其实可以解出来,具体来说 递推式到通相式 直接待定系数,解回去就把系数代回去就行了。

但是没有必要,\(f(n)\) 是个能打表的东西。

\[f(n) = \begin{cases}
0, &n = 0 \\
1, &n = 1 \\
2f(n - 1) + f(n-2) &\mathrm{otherwise}
\end{cases}
\]

然后它具有和 \(fib(i)\) 一样的性质, \(\gcd (f(i), f(j)) = f(\gcd(i, j))\) 。

至于证明,可以类似 \(fib(i)\) 的性质证明。

然后考虑最值反演:

不会的话可以看我 这篇博客

然后我们可以把这个对于 \(\mathrm{lcm}\) 放到指数上来就是所有指数的 \(\max\) ,那么我们可以用最值反演变成 \(\min\) ,也就是 \(\gcd\) 。

形式如下

\[\mathrm{lcm}(S) = \prod_{T \subseteq S, T \not = \varnothing} \gcd(T)^{(-1)^{|T|-1}}
\]

然后我们利用这个性质进行推导。

\[\begin{align}
g(n) &= \prod_{T \subseteq S, T \not = \varnothing} \gcd_{x \in T}\{f(x)\}^{(-1)^{|T|+1}} \\
&= \prod_{T \subseteq S, T \not = \varnothing} f(\gcd(T))^{(-1)^{|T|+1}}\\
\end{align}
\]

然后考虑构造一个函数 \(h\) 满足

\[f(n) = \prod_{d|n} h(d)
\]

由于在模素数意义下,所以必定存在 \(h\) 满足要求。

然后我们考虑每个 \(h(d)\) 的贡献:

\[\begin{align}
\Rightarrow
g(n) &= \prod_{d = 1}^{n} h(d)^{\sum_{T\subseteq S, T \not = \varnothing}[d | \gcd(T)](-1)^{|T|+1}} \\
&= \prod_{d = 1}^{n} h(d)
\end{align}
\]

至于上面那个系数为什么 \(=1\) 呢?可以考虑 \(T\) 集合中所有为 \(d\) 倍数的数构成的所有集合,刚好是 \(2^k - 1\) 的,除去空集,那么剩下的一一抵消,剩下一个 \(1\) 的贡献。

考虑求出 \(h\) 是可以枚举倍数来优化到 \(O(n \ln n)\) 的。

具体来说假设我们 \(<n\) 的所有 \(h\) 都求好了,那么当前的 \(\displaystyle h(n) = f(n) \prod_{d|n, d \not = n} \frac{1}{h(d)}\) 。

其实可以用莫比乌斯反演推回去的,但没必要筛 \(\mu\) 。

那么能不能用线性筛优化到 \(O(n)\) 呢?似乎是不行的,因为 \(h\) 不是积性的,我们知道 \(h(i)\) 与 \(h(p)\) 无法推出 \(h(i \times p)\) 。

然后最后复杂度就是 \(O(\sum n \ln n)\) 的。

总结

对于有些看起来不太好求的 \(\mathrm{lcm}\) 题,考虑最值反演。然后考虑构造积性函数,最后求出积性函数求回来就行了。

代码

/**************************************************************
Problem: 4833
User: zjp_shadow
Language: C++
Result: Accepted
Time:5908 ms
Memory:13024 kb
****************************************************************/ #include <bits/stdc++.h> #define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl
#define DEBUG(...) fprintf(stderr, __VA_ARGS__) using namespace std; typedef long long ll; template<typename T> inline bool chkmin(T &a, T b) {return b < a ? a = b, 1 : 0;}
template<typename T> inline bool chkmax(T &a, T b) {return b > a ? a = b, 1 : 0;} inline int read() {
int x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
} void File() {
#ifdef zjp_shadow
freopen ("4883.in", "r", stdin);
freopen ("4883.out", "w", stdout);
#endif
} const int N = 1e6 + 1e3; int Mod, h[N], g[N], ans[N]; ll fpm(ll x, int power) {
ll res = 1;
for (; power; power >>= 1, (x *= x) %= Mod)
if (power & 1) (res *= x) %= Mod;
return res;
} void Solve(int maxn) {
h[1] = 1;
For (i, 2, maxn)
h[i] = (h[i - 1] * 2ll + h[i - 2]) % Mod;
For (i, 2, maxn) {
int inv = fpm(h[i], Mod - 2);
for (int j = i * 2; j <= maxn; j += i)
h[j] = 1ll * h[j] * inv % Mod;
}
g[0] = 1; int ans = 0;
For (i, 1, maxn) {
g[i] = 1ll * g[i - 1] * h[i] % Mod;
ans = (ans + 1ll * g[i] * i) % Mod;
}
printf ("%d\n", ans);
} int main () { File(); int cases = read();
while (cases --) {
int n = read(); Mod = read(); Solve(n);
} return 0; }

BZOJ 4833: [Lydsy1704月赛]最小公倍佩尔数(数论 + 最值反演)的更多相关文章

  1. BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数(min-max容斥&莫比乌斯反演)(线性多项式多个数求LCM)

    4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 240  Solved: 118[Submit][S ...

  2. [Lydsy1704月赛] 最小公倍佩尔数

    4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 202  Solved: 99[Submit][St ...

  3. 【bzoj 4833】[Lydsy1704月赛]最小公倍佩尔数

    Description 令 $(1+\sqrt 2)^n=e(n)+\sqrt 2\cdot f(n)$ ,其中 $e(n),f(n)$ 都是整数,显然有 $(1-\sqrt 2)^n=e(n)-\s ...

  4. BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数

    Problem 传送门 Sol 容易得到 \[f_n=e_{n-1}+f_{n-1},e_{n-1}=f_{n-1}+e_{n-1},f_1=e_1=1\] 那么 \[f_n=2\times \sum ...

  5. 【BZOJ4833】最小公倍佩尔数(min-max容斥)

    [BZOJ4833]最小公倍佩尔数(min-max容斥) 题面 BZOJ 题解 首先考虑怎么求\(f(n)\),考虑递推这个东西 \((1+\sqrt 2)(e(n-1)+f(n-1)\sqrt 2) ...

  6. [bzoj 4833]最小公倍佩尔数

    传送门 Description   Let \((1+\sqrt2)^n=e(n)+f(n)\cdot\sqrt2\) , both \(e(n)\) and \(f(n)\) are integer ...

  7. bzoj 4831 [Lydsy1704月赛]序列操作 dp

    [Lydsy1704月赛]序列操作 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 203  Solved: 69[Submit][Status][Dis ...

  8. bzoj 4836 [Lydsy1704月赛]二元运算 分治FFT+生成函数

    [Lydsy1704月赛]二元运算 Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 577  Solved: 201[Submit][Status][Di ...

  9. BZOJ.4832.[Lydsy1704月赛]抵制克苏恩(期望DP)

    题目链接 \(f[s][i][j][k]\)表示还剩\(s\)次攻击,分别有\(i,j,k\)个血量为\(1,2,3\)的奴隶主时,期望受到伤害. 因为期望是倒推,所以这么表示从后往前求,注意\(a, ...

随机推荐

  1. 16-使用Selenium模拟浏览器抓取淘宝商品美食信息

    淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击.输入.下拉等,这样我们只需要关心操作而不需要关心后台发生了 ...

  2. mysql面试题目1

    有这样一个成绩表,学生A,B,C,三个人,考试科目分别为C(chinese),M(math),E(english) 求三门课成绩都大于80分的那个学生姓名: 即查询的方法可分为俩种:select na ...

  3. Dapper.NET

    关于Dapper.NET的相关论述   年少时,为何不为自己的梦想去拼搏一次呢?纵使头破血流,也不悔有那年少轻狂.感慨很多,最近事情也很多,博客也很少更新了,毕竟每个人都需要为自己的生活去努力. 最近 ...

  4. API接口TOKEN设计

    首先需要知道API是什么?   API(Application Programming Interface)即应用程序接口.你可以认为 API 是一个软件组件或是一个 Web 服务与外界进行的交互的接 ...

  5. [转帖]ipvsadm命令参考及其应用例子

    ipvsadm命令参考及其应用例子 https://blog.csdn.net/orichisonic/article/details/47375227 只是简单创建了 service和添加serve ...

  6. 剑指offer(6)

    题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  7. switch-case和if-else可互换时

    当switch-case和if-else可互换时,应当优先采用switch-case.因为switch-case的效率更高(详情下回分解).

  8. 防火墙禁ping:虚拟机ping不通主机,但主机可以ping虚拟机

    现象:刚装的centos6.6,配置好网络却发现ping不通主机,主机却ping通虚拟机: 解决方法: 1.最简单的方法就是:关闭防火墙.但一直关闭防火墙也不是个办法,会遇到很多安全问题,建议下一个方 ...

  9. uname -r查询版本不是安装的版本的问题

    uname -r 查出来的版本与/lib/modules下面的内核版本不匹配.啥原因? 第一步,先strace uname -r看看这个uname -r到底从哪里获取的版本. strace没有看出来 ...

  10. Java多线程6:Synchronized锁代码块(this和任意对象)

    一.Synchronized(this)锁代码块 用关键字synchronized修饰方法在有些情况下是有弊端的,若是执行该方法所需的时间比较长,线程1执行该方法的时候,线程2就必须等待.这种情况下就 ...