#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <cassert>
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=;
ll powmod(ll a,ll b) {ll res=;a%=mod; assert(b>=); for(;b;b>>=){if(b&)res=res*a%mod;a=a*a%mod;}return res;}
// head int _,n;
namespace linear_seq {
const int N=;
ll res[N],base[N],_c[N],_md[N]; vector<int> Md;
void mul(ll *a,ll *b,int k) {
rep(i,,k+k) _c[i]=;
rep(i,,k) if (a[i]) rep(j,,k) _c[i+j]=(_c[i+j]+a[i]*b[j])%mod;
for (int i=k+k-;i>=k;i--) if (_c[i])
rep(j,,SZ(Md)) _c[i-k+Md[j]]=(_c[i-k+Md[j]]-_c[i]*_md[Md[j]])%mod;
rep(i,,k) a[i]=_c[i];
}
int solve(ll n,VI a,VI b) { // a 系数 b 初值 b[n+1]=a[0]*b[n]+...
// printf("%d\n",SZ(b));
ll ans=,pnt=;
int k=SZ(a);
assert(SZ(a)==SZ(b));
rep(i,,k) _md[k--i]=-a[i];_md[k]=;
Md.clear();
rep(i,,k) if (_md[i]!=) Md.push_back(i);
rep(i,,k) res[i]=base[i]=;
res[]=;
while ((1ll<<pnt)<=n) pnt++;
for (int p=pnt;p>=;p--) {
mul(res,res,k);
if ((n>>p)&) {
for (int i=k-;i>=;i--) res[i+]=res[i];res[]=;
rep(j,,SZ(Md)) res[Md[j]]=(res[Md[j]]-res[k]*_md[Md[j]])%mod;
}
}
rep(i,,k) ans=(ans+res[i]*b[i])%mod;
if (ans<) ans+=mod;
return ans;
}
VI BM(VI s) {
VI C(,),B(,);
int L=,m=,b=;
rep(n,,SZ(s)) {
ll d=;
rep(i,,L+) d=(d+(ll)C[i]*s[n-i])%mod;
if (d==) ++m;
else if (*L<=n) {
VI T=C;
ll c=mod-d*powmod(b,mod-)%mod;
while (SZ(C)<SZ(B)+m) C.pb();
rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
L=n+-L; B=T; b=d; m=;
} else {
ll c=mod-d*powmod(b,mod-)%mod;
while (SZ(C)<SZ(B)+m) C.pb();
rep(i,,SZ(B)) C[i+m]=(C[i+m]+c*B[i])%mod;
++m;
}
}
return C;
}
int gao(VI a,ll n) {
VI c=BM(a);
c.erase(c.begin());
rep(i,,SZ(c)) c[i]=(mod-c[i])%mod;
return solve(n,c,VI(a.begin(),a.begin()+SZ(c)));
}
}; int main() {
while (~scanf("%d",&n)) {
vector<int>v;
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
v.push_back();
//VI{1,2,4,7,13,24}
printf("%d\n",linear_seq::gao(v,n-));
}
} BM

最新文章

  1. 算法与数据结构(十四) 堆排序 (Swift 3.0版)
  2. JavaScript模板引擎artTemplate.js——两种方法实现性别的判定
  3. 安装并配置前端自动化工具——grunt
  4. Eclipse10个最有用的快捷键[From: Internet]
  5. 【转】持久化消息队列之MEMCACHEQ
  6. winform 可拖动的自定义Label控件
  7. WMSYS.WM_CONCAT(distinct(字段名)) 函数,字符串拼接函数。合并列
  8. 模拟 Codeforces Round #288 (Div. 2) A. Pasha and Pixels
  9. IoC实践--用Autofac实现MVC5.0的IoC控制反转方法
  10. iOS中的触摸事件和手势处理
  11. jq鼠标点击滚动锚点
  12. 安装MySQL的心得
  13. html5 canvas 圆形抽奖的实例
  14. 430的启动,I/O中断
  15. 4 - SQL Server 2008 之 使用SQL语句删除表格
  16. BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )
  17. 自动化服务部署(一):Linux下安装JDK
  18. oracle 11g杀掉锁的sql
  19. 设计模式—桥接模式的C++实现
  20. 3 jmeter的两种录制方法

热门文章

  1. ubuntu18.04 蓝牙打开无效,解决办法升级内核
  2. VBox 安装 Ubuntu Server 的那些坑,键盘乱码、网卡互连、共享目录等
  3. 190. Reverse Bits 二进制相反数
  4. weblogic参数说明
  5. list 的扩展
  6. Luogu 4438 [HNOI/AHOI2018]道路
  7. OpenCV2.3.0在VS中的配置
  8. UIView的alpha、hidden和opaque属性之间的关系和区别[转]
  9. (转)用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记
  10. 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串