codeforces 717A. Festival Organization

题目链接:CF717A

翻译:luogu

对于一个确定的长度\(n\),合法的方案数为\(fib_{n+2}\)

所以最后求的就是\(\sum_{i=l}^r\dbinom{fib_{i+2}}{k}\)

\(f_n=\sum_{i=0}^n\dbinom{fib_i}{k}\),那么答案也就是\(f_{r+2}-f_{l+1}\)

推一下式子
\[ \begin{aligned} f_n=&\sum_{i=0}^n\frac{fib_i!}{k!(fib_i-k)!}\\ =&\frac{1}{k!}\sum_{i=0}^n\frac{fib_i!}{(fib_i-k)!}\\ =&\frac{1}{k!}\sum_{i=0}^nfib_i^{\underline{k}}\\ =&\frac{1}{k!}\sum_{i=0}^n\sum_{j=0}^k(-1)^{j-k}\begin{bmatrix}k\\j\end{bmatrix}fib_i^j\\ =&\frac{1}{k!}\sum_{j=0}^k\begin{bmatrix}k\\j\end{bmatrix}(-1)^{k-j}\sum_{i=0}^nfib_i^j \end{aligned} \]
基本上就是运用了一下第一类斯特林数和下降幂之间的关系

问题就是对每个给定的\(j\),怎么求\(\sum_{i=0}^n fib_i^j\)

我们有\(fib_n=\frac{(\frac{1+\sqrt5}{2})^n-(\frac{1-\sqrt5}{2})^n}{\sqrt5}\),令\(a=\frac{1+\sqrt5}{2},b=\frac{1-\sqrt5}{2}\)

\(\sum_{i=0}^nfib_i^j=\sum_{i=0}^n\frac{(a^i-b^i)^j}{(\sqrt5)^j}=\frac{\sum_{k=0}^j {j\choose k}(-1)^k\sum_{i=0}^n(b^ka^{j-k})^i}{(\sqrt5)^j}\)

上面这个式子用二项式定理展开后,最后的那个sigma可以用等比数列求和解决

貌似时间是\(O(klogr)\),结合一开始的最外面枚举\(j\)总时间是\(O(k^2logr)\)

时间没有问题,但是注意到\(5\)在模\(1000000007\)意义下并没有二次剩余

考虑扩域,即类比虚数,将所有数定义成\(a+b\sqrt5\)的形式,重新定义四则运算即可(除法的话直接考虑分母有理化即可)

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define lowbit(x) (x)&(-x)
#define sqr(x) (x)*(x)
#define fir first
#define sec second
#define rep(i,a,b) for (register int i=a;i<=b;i++)
#define per(i,a,b) for (register int i=a;i>=b;i--)
#define maxd 1000000007
#define inv2 500000004
#define eps 1e-6
typedef long long ll;
const int N=200;
const double pi=acos(-1.0);
int k;
ll l,r,c[220][220],s[220][220],invk=1;

ll qpow(ll x,ll y)
{
    ll ans=1;
    while (y)
    {
        if (y&1) ans=ans*x%maxd;
        x=x*x%maxd;y>>=1;
    }
    return ans;
}
struct Complex{
    ll x,y;
    Complex(ll _x=0,ll _y=0) {x=_x;y=_y;}
};
Complex operator +(Complex a,Complex b)
{
    return Complex((a.x+b.x)%maxd,(a.y+b.y)%maxd);
}

Complex operator -(Complex a,Complex b)
{
    return Complex((a.x-b.x+maxd)%maxd,(a.y-b.y+maxd)%maxd);
}

Complex operator *(Complex a,Complex b)
{
    return Complex((a.x*b.x+a.y*b.y%maxd*5)%maxd,(a.x*b.y+a.y*b.x)%maxd);
}

Complex operator /(Complex a,Complex b)
{
    a=a*Complex(b.x,maxd-b.y);b=b*Complex(b.x,maxd-b.y);
    ll inv=qpow(b.x,maxd-2);
    a.x=a.x*inv%maxd;a.y=a.y*inv%maxd;
    return a;
}

Complex qpow(Complex a,ll y)
{
    Complex ans=Complex(1,0);
    while (y)
    {
        if (y&1) ans=ans*a;
        a=a*a;y>>=1;
    }
    return ans;
}

void init()
{
    s[0][0]=1;c[0][0]=1;
    rep(i,1,N)
    {
        c[i][0]=1;
        rep(j,1,i)
        {
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%maxd;
            s[i][j]=(s[i-1][j-1]+s[i-1][j]*(i-1))%maxd;
        }
    }
    rep(i,1,k) invk=invk*i%maxd;
    invk=qpow(invk,maxd-2); 
}

Complex calc(Complex a,ll n)
{
    Complex tmp=Complex(1,0);
    if((a.x==1) && (!a.y)) return Complex((n+1)%maxd,0);
    else return (qpow(a,n+1)-tmp)/(a-tmp);
}

ll solve(ll n)
{
    Complex a=Complex(inv2,inv2),b=Complex(inv2,maxd-inv2);
    ll ans=0;
    rep(i,0,k)
    {
        ll now=s[k][i];
        if ((k-i)&1) now=(maxd-now)%maxd;
        Complex sum=Complex(0,0);
        rep(j,0,i)
        {
            Complex tmp1=Complex(0,0);
            if (j&1) tmp1.x=maxd-c[i][j];else tmp1.x=c[i][j];
            tmp1=tmp1*calc(qpow(b,j)*qpow(a,i-j),n);
            sum=sum+tmp1;
        }
        Complex inv=Complex();
        if (i&1) inv.y=qpow(5,i/2);else inv.x=qpow(5,i/2);
        sum=sum/inv;
        ans=(ans+now*sum.x)%maxd;
    }
    ans=ans*invk%maxd;
    return ans;
}

int main()
{
    scanf("%d%lld%lld",&k,&l,&r);
    init();
    printf("%lld",(solve(r+2)-solve(l+1)+maxd)%maxd);
    return 0;
}

转载于:https://www.cnblogs.com/encodetalker/p/10911755.html

内容概要:本文系统阐述了Java Persistence API(JPA)的核心概念、技术架构、核心组件及实践应用,重点介绍了JPA作为Java官方定义的对象关系映射(ORM)规范,如何通过实体类、EntityManager、JPQL和persistence.xml配置文件实现Java对象与数据库表之间的映射与操作。文章详细说明了JPA解决的传统JDBC开发痛点,如代码冗余、对象映射繁琐、跨数据库兼容性差等问题,并解析了JPA与Hibernate、EclipseLink等实现框架的关系。同时提供了基于Hibernate和MySQL的完整实践案例,涵盖Maven依赖配置、实体类定义、CRUD操作实现等关键步骤,并列举了常用JPA注解及其用途。最后总结了JPA的标准化优势、开发效率提升能力及在Spring生态中的延伸应用。 适合人群:具备一定Java基础,熟悉基本数据库操作,工作1-3年的后端开发人员或正在学习ORM技术的中级开发者。 使用场景及目标:①理解JPA作为ORM规范的核心原理与组件协作机制;②掌握基于JPA+Hibernate进行数据库操作的开发流程;③为技术选型、团队培训或向Spring Data JPA过渡提供理论与实践基础。 阅读建议:此资源以理论结合实践的方式讲解JPA,建议读者在学习过程中同步搭建环境,动手实现文中示例代码,重点关注EntityManager的使用、JPQL语法特点以及注解配置规则,从而深入理解JPA的设计思想与工程价值。
先看效果: https://pan.quark.cn/s/d787a05b82eb 西门子SCALANCE X系列交换机是西门子公司所提供的工业以太网交换机产品系列,其在工业自动化领域具有广泛的应用。 如果在应用期间遭遇固件升级失误或采用了不相容的固件版本,可能会导致交换机无法正常启动。 在这种情况下,通常能够借助FTP(文件传输协议)来恢复交换机的固件,从而使其恢复正常运作。 本文件详细阐述了利用FTP修复SCALANCE X系列交换机固件的方法,并具体说明了实施步骤。 当SCALANCE X系列交换机的固件出现故障时,设备在启动后会自动激活引导加载程序,并通过故障LED的闪烁来表明设备处于特殊情形。 在这种情形下,交换机能够充当FTP服务器,与客户端建立联系,执行固件数据的传输。 需要特别强调的是,对于SCALANCE X200系列交换机,必须经由端口1来连接FTP客户端。 在实施步骤方面,首先需要为交换机指定一个IP地址。 这一步骤通常借助西门子公司提供的PST(Product Support Tools)软件来实施。 在成功配置IP地址之后,就可以通过FTP协议与交换机内部的FTP服务器建立连接,并借助FTP客户端将固件文件传输到交换机。 需要留意的是,在传输固件文件之前,应当先从西门子技术支持网站获取对应订货号的固件版本文件。 一旦固件文件备妥,就可以开始FTP操作。 这通常涉及打开操作系统的DOS窗口,运用FTP指令连接到交换机的FTP服务器,并输入正确的用户名和密码进行身份验证。 在本案例中,用户名和密码均为“siemens”,并且传输模式设定为二进制。 随后,使用FTP的“put”指令将本地固件文件上传至交换机。 值得留意的是,固件文件名必须严格遵循大小写规则。 上传成功后,...
源码地址: https://pan.quark.cn/s/f24fc84966ae 人机交互在电子工程领域中占据着核心地位,它具体指的是单片机系统与用户之间进行信息交换和管理操作的方法。 在此过程中,单片机系统负责接收用户的输入信号,对收集到的信息进行加工处理,并通过特定媒介将处理结果呈现给用户,这些媒介包括但不限于显示器、LED指示灯以及蜂鸣器等设备。 在本探讨的主题中,我们将重点研究按键与1602液晶显示屏之间的交互机制。 1602液晶显示屏是单片机应用领域中一种极为常见的人机交互界面设备,其功能在于能够显示两行文本,每行包含16个字符。 此类显示器通常采用串行或并行接口与单片机设备进行连接,主要用途是展示程序运行的状态信息、数据读取的最终结果以及其他相关的重要资讯。 我们需要深入理解如何对1602液晶显示屏进行配置和控制。 这一过程通常涉及到初始化序列的执行,其中包括设定显示模式(例如开启/关闭状态、光标移动的方向以及是否启用闪烁效果),同时选择合适的数据传输方式(4线或8线模式)。 单片机系统必须向液晶显示屏发送特定的指令集,以此来设定上述参数。 举例来说,可以通过RS(寄存器选择)、RW(读写信号)以及E(使能)引脚与LCD设备进行通信。 接下来,我们将详细讨论按键接口的设计方案。 按键通常作为输入设备存在,允许用户向单片机系统发送指令或数据。 在单片机系统中,按键通常与IO端口相连接,通过检测IO端口电平的变化来判断按键是否被触发。 对于基础的按键应用场景,可能仅需检测按键闭合时产生的低电平信号;而对于更为复杂的应用场景,则可能需要处理消抖问题,以防止因机械接触产生的瞬间抖动导致错误的读数。 在Proteus软件环境中,我们可以构建虚拟的电路模型来模拟单片机系统,其中包括1...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值