杜教筛BM(找规律)

2023-10-30

代码来自学长

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define pb push_back
typedef long long ll;
#define SZ(x) ((ll)(x).size())
typedef vector<ll> VI;
typedef pair<ll,ll> PII;
const ll mod=1000000007;
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
// head
 
ll _,n;
namespace linear_seq {
    const ll N=10010;
    ll res[N],base[N],_c[N],_md[N];
 
    vector<ll> Md;
    void mul(ll *a,ll *b,ll k) {
        rep(i,0,k+k) _c[i]=0;
        rep(i,0,k) if (a[i]) rep(j,0,k) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
        for (ll i=k+k-1;i>=k;i--) if (_c[i])
            rep(j,0,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
        rep(i,0,k) a[i]=_c[i];
    }
    ll solve(ll n,VI a,VI b) { 

        ll ans=0,pnt=0;
        ll k=SZ(a);
        assert(SZ(a)==SZ(b));
        rep(i,0,k) _md[k-1-i]=-a[i];_md[k]=1;
        Md.clear();
        rep(i,0,k) if (_md[i]!=0) Md.push_back(i);
        rep(i,0,k) res[i]=base[i]=0;
        res[0]=1;
        while ((1ll<<pnt)<=n) pnt++;
        for (ll p=pnt;p>=0;p--) {
            mul(res,res,k);
            if ((n>>p)&1) {
                for (ll i=k-1;i>=0;i--) res[i+1]=res[i];res[0]=0;
                rep(j,0,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
            }
        }
        rep(i,0,k) ans=(ans+res[i]*b[i])%mod;
        if (ans<0) ans+=mod;
        return ans;
    }
    VI BM(VI s) {
        VI C(1,1),B(1,1);
        ll L=0,m=1,b=1;
        rep(n,0,SZ(s)) {
            ll d=0;
            rep(i,0,L+1) d=(d+(ll)C[i]*s[n-i])%mod;
            if (d==0) ++m;
            else if (2*L<=n) {
                VI T=C;
                ll c=mod-d*powmod(b,mod-2)%mod;
                while (SZ(C)<SZ(B)+m) C.pb(0);
                rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
                L=n+1-L; B=T; b=d; m=1;
            } else {
                ll c=mod-d*powmod(b,mod-2)%mod;
                while (SZ(C)<SZ(B)+m) C.pb(0);
                rep(i,0,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
                ++m;
            }
        }
        return C;
    }
    ll gao(VI a,ll n) {
        VI c=BM(a);
        c.erase(c.begin());
        rep(i,0,SZ(c)) c[i]=(mod-c[i])%mod;
        return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
    }
};
 
int main() {
    int T;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%lld",&n);
        vector<ll>v;
        v.push_back(3);
        v.push_back(9);
        v.push_back(20);
        v.push_back(46);
        v.push_back(106);
        v.push_back(244);
        v.push_back(560);
        v.push_back(1286);
        v.push_back(2956);
        v.push_back(6794);
         
        printf("%lld\n",linear_seq::gao(v,n-1));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

杜教筛BM(找规律) 的相关文章

随机推荐

  • Vuepress码云部署及自动跳转404 的问题

    介绍 VuePress 由两部分组成 一个以 Vue 驱动的主题系统的简约静态网站生成工具 和一个为编写技术文档而优化的默认主题 它是为了支持 Vue 子项目的文档需求而创建的 由 VuePress 生成的每个页面 都具有相应的预渲染静态
  • PyCharm+Docker:打造最舒适的深度学习炼丹炉

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 来自 知乎 作者 刘震 链接 https zhuanlan zhihu com p 52827335 编辑 人工智能前沿讲习 一般炼丹都在服务器上 很少有人在本机跑代码的
  • 跨时钟域信号处理(一)--Verilog单比特信号

    网上有很多的跨时钟域信号处理的相关文章 主要分为三种 单比特信号 打两拍或打更多拍 使用触发器 多比特信号 异步双口块RAM或者异步FIFO 格雷码转换 这次就主要说第1种情况 适用于单比特信号 1 应用场景 从时钟域1的单比特信号DATA
  • 【python】动态规划算法学习:0-1背包问题 -牛客网HJ16 购物单

    这里写目录标题 题目HJ16 购物单 问题理解 代码 题目HJ16 购物单 描述 王强决定把年终奖用于购物 他把想买的物品分为两类 主件与附件 附件是从属于某个主件的 下表就是一些主件与附件的例子 主件 附件 电脑 打印机 扫描仪 书柜 图
  • Git(三) Git 图形化管理工具 SourceTree 全部实用操作

    Git 三 Git 图形化管理工具 SourceTree 全部实用操作 上篇文章主要说到Git的账号情况 Getlab账号和Github账号同时使用 本篇文章接着上篇内容继续为大家介绍 Git的图形化管理工具 SourceTree 前言 一
  • 文件下载中文文件名不显示

    使用response setHeader Content Disposition attachment filename fName 下载文件 中文文件名无法显示的问题 今天遇到这么一个情况 在Controller代码中进行文件下载 其中f
  • js 多个if else如何优化?

    function getUserDescribe name if name length gt 3 console log 名字太长 else if name length lt 2 console log 名字太短 else if nam
  • 导入时报错 :No module named ‘tensorflow.contrib‘ 问题的解决

    No module named tensorflow contrib 问题解决 问题描述 在tensorflow contrib模块的调用报错 No module named tensorflow contrib 解决方案 我给删了大不了不
  • [CISCN2019 华北赛区 Day1 Web2]ikun (JWT更改与python反序列化)

    前言 文章所涉及的资料来自互联网整理和个人总结 意在于个人学习和经验汇总 如有什么地方侵权 请联系本人删除 谢谢 本文仅用于学习与交流 不得用于非法用途 题目 提示是要买到Iv6 有很多页面 需要写脚本来找 import requests
  • 基于时间轮片方式处理超时任务

    作者 酱了里个酱 来源 掘金 https juejin im post 5e733e4f51882549417fe9aa 背景 最近收到小伙伴的一个吐槽 项目里的某个函数是同步阻塞的 无法确定其运行时间 某些情况下 可能出现长时间阻塞导致应
  • 计算机视觉与深度学习-全连接神经网络-激活函数- [北邮鲁鹏]

    文章目录 基础知识 为什么需要非线性操作 激活函数 激活函数 vs 数据预处理 常用的激活函数 Sigmoid函数 Logistic函数 双曲正切函数 Tanh函数 线性整流函数 ReLU函数 Leaky ReLU函数 Softmax函数
  • BTC txid与vote的关系

    当我通过BTC的listtransactions接口获取查询最近发生的钱包交易时 需要将用户的充值记录写到数据库时 发现了一些令人巨大的误解 例如 txid字段并不是唯一的 所以写到数据库时 会有交易哈希重复的可能性 有可能你的两个用户在币
  • python处理xml文件

    1 python 操作xml的方式介绍 查看全部包含 三种 法 是xml dom 模块 它是W3CDOMAPI的实现 若需要处理DOMAPI则该模块很适合 是xml sax 模块 它是SAXAPI的实现 这个模块牺牲了便捷性来换取速度和内存
  • matlab中varargout简介

    varargout可以看做 Variable length output argument list 的缩写 在matlab中定义m函数时通过 varargout我们可以得到可变个数个返回值 在matlab命令窗口中输入doc vararg
  • 【H5】Cookie、Session、Token、JWT区别及使用方法

    Token 和 Session 的区别 Session 是一种记录服务器和客户端会话状态的机制 使服务端有状态化 可以记录会话信息 而 Token 是令牌 访问资源接口 API 时所需要的资源凭证 Token 使服务端无状态化 不会存储会话
  • Spring Boot 集成 Flowable 并自定义数据源

    永久链接 https blog kekwy com flowable datasource 问题描述 在使用 flowable spring boot starter 进行 spring boot 集成 flowable 时 flowabl
  • Python爬虫——urllib_post请求百度翻译

    post请求 post的请求参数 是不会拼接在url后面的 而是需要放在请求对象定制的参数中 post请求的参数需要进行两次编码 第一次urlencode 对字典参数进行Unicode编码转成字符串 第二次encode 将字符串数据转换为字
  • 插值法

    插值 根据已知数据点 条件 预测未知数据点的值的方法 1 多项式插值法 多项式插值法 多项式插值法 所求的插值函数是多项式 其中 就是所要求的参数 多项式插值基本公式 求系数 1 1 拉格朗日插值法 设函数 y f x 在区间 a b 上有
  • 希尔排序(重点讲解如何分组)---------通俗易懂,直击重点!!!

    文章目录 希尔排序的历史 一 关于希尔排序 二 希尔排序的思路 三 代码实例讲解 总结 希尔排序的历史 希尔排序按其设计者希尔 Donald Shell 的名字命名 该算法由希尔 1959 年公布 1 希尔排序是基于插入排序的以下两点性质而
  • 杜教筛BM(找规律)

    代码来自学长 include