Description

令 $(1+\sqrt 2)^n=e(n)+\sqrt 2\cdot f(n)$ ,其中 $e(n),f(n)$ 都是整数,显然有 $(1-\sqrt 2)^n=e(n)-\sqrt 2\cdot f(n)$。令 $g(n)$ 表示 $f(1),f(2),\cdots ,f(n)$ 的最小公倍数,给定两个正整数 $n$ 和 $p$ ,其中 $p$ 是质数,并且保证 $f(1),f(2),\cdots ,f(n)$ 在模 $p$ 意义下均不为 $0$,请计算 $\sum _{i=1}^{n}i\cdot g(i)$ 模 $p$ 的值。

Input

第一行包含一个正整数 $T$ ,表示有 $T$ 组数据,满足 $T\leq 2^{10}$ 。接下来是测试数据。每组测试数据只占一行,包含两个正整数 $n$ 和 $p$ ,满足 $1\leq n\leq 10^6,2\leq p\leq 10^9+7$ 。保证所有测试数据的 $n$ 之和不超过 $3\times 10^6$ 。

Output

对于每组测试数据,输出一行一个非负整数,表示这组数据的答案。

在开始推导前先观察两个式子:

$$gcd(fib(a),fib(b))=fib(gcd(a,b))$$

$$gcd(x^a-1,x^b-1)=x^{gcd(a,b)}-1$$

形如 $f(n)=a\cdot f(n-1)+b\cdot f(n-2)$ 的式子具有性质 $gcd(f(x),f(y))=f(gcd(x,y))$ 。

而题目中的式子等价于: $f(0)=0,f(1)=1,f(n)=2f(n-1)+f(n-2)$,同样满足这个性质。

(以下集合 $T$ 均满足 $T\neq \varnothing $)

再由式子:$$lcm(S)=\prod_{T\subset S}gcd(T)^{(-1)^{|T|+1}}$$

可以得到:$$g(n)=\prod _{T\subset 2^{[n]}}f(gcd_{i\in T}(i))^{(-1)^{|T|+1}}$$

构造出 $h$ 满足 $f(n)=\prod _{d|n}h(d)$

得到式子:$$\begin{align*} g(n)&=\prod _{T\subset 2^{[n]}}\left ( \prod _{d|gcd_{i\in T}(i)}h(d) \right )^{(-1)^{|T|+1}}\\ &=\prod _{d=1}^{n}h(d)^{\sum _{T\subset 2^{~[\lfloor \frac{n}{d}\rfloor ]~}}(-1)^{|T|+1}} \end{align*}$$

又由二项式定理可证:$$\sum _{T\subset 2^{[\lfloor \frac{n}{d}\rfloor ]}}(-1)^{|T|+1}=-\sum _{i=1}^{\frac{n}{d}}(-1)^i\binom{\frac{n}{d}}{i}=1$$

所以 $g(n)=\prod _{d=1}^{n}h(d)$

问题解决,时间复杂度 $O(nlogn)$。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int N=1e6+;
int T,n,mod,inv,sum,ans,f[N],h[N];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int power(int a,int b)
{
int ans=;
while(b)
{
if(b&)ans=1ll*ans*a%mod;
a=1ll*a*a%mod;b>>=;
}
return ans;
}
int main()
{
T=read();
while(T--)
{
n=read();mod=read();
f[]=;h[]=f[]=;
for(int i=;i<=n;i++)
h[i]=f[i]=(1ll*f[i-]*+f[i-])%mod;
for(int i=;i<=n;i++)
{
inv=power(h[i],mod-);
for(int j=i+i;j<=n;j+=i)h[j]=1ll*h[j]*inv%mod;
}
sum=;ans=;
for(int i=;i<=n;i++)
sum=1ll*sum*h[i]%mod,ans=(ans+1ll*sum*i)%mod;
printf("%d\n",ans);
}
return ;
}

【bzoj 4833】[Lydsy1704月赛]最小公倍佩尔数的更多相关文章

  1. BZOJ 4833: [Lydsy1704月赛]最小公倍佩尔数(数论 + 最值反演)

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

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

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

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

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

  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. windows 2008 开机启动 Docker Toolbox 并运行容器

    新建 docker-startup.bat @echo off REM Set the name of the VM configuration where dockerd will be hoste ...

  2. [已解决]ValueError: row index was 65536, not allowed by .xls format

    报错: ValueError: row index was 65536, not allowed by .xls format 解决方案: xlrd和xlwt处理的是xls文件,单个sheet最大行数 ...

  3. git 添加、提交、推送

    只添加本地修改的一个文件 如,只添加package.json一个文件 git add package.json git commit -m "修改qa环境版本号" git push ...

  4. from语法导入

    """# 在执行文件中能不能直接使用模块中的名字 # import m1# import m1 as m# print(m1.a)# print(m1.b)# print ...

  5. [原创]一种专门用于前后端分离的web服务器(JerryServer)

    如果你还不了解现在的前后端分离,推荐阅读淘宝前端团队的前后端分离的思考与实践 1.问题 随着现在整个软件开发行业的发展,在开发模式上逐渐由以前的一个人完成服务端和前端web页面,演变为前端和后端逐渐分 ...

  6. Object 与 T的差别 导致swagger 的model 显示的数据为空

    情景复现: 在整合swagger的时候,自己对原本定于的Object的data做了修改,把Object修改为了T,data的set方法的返回类型由于编译器没有报错,就没有去做修改, 这个时候就导致了, ...

  7. clipboardjs复制到粘贴板

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  8. 【问题解决方案】AttributeError: module 'pygal' has no attribute 'Worldmap'

    <Python编程:从入门到实践>- 16章-16.2.5制作世界地图 import pygal 后报如标题的error 参考CSDN 解决:AttributeError: module ...

  9. Docker 核心技术之镜像

    镜像简介 镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容.依赖库.环境变量和配置文件等. 通过镜像可以创建一个或多个容器. 镜像搜索 - docker search 作用: ...

  10. 使用C++进行WMI查询的简单封装

    封装WMI查询的简单类CWMIUtil 头文件WMIUtil.h #pragma once #include <Wbemidl.h> class CWMIUtil { public: CW ...