设 g(x) = f(x) * x ,多项式 A = Σ g(i) * x^i , 多项式  B = Σ f(i) * x^i。

首先,g(x) = g(x-1) + g(x-2) + f(x-1) + 2f(x-2),所以我们可以得到: A = x * A + x^2 * A + x * B + 2 * x^2 * B + x

又因为B是斐波那契数列的多项式,所以B的闭形式可以直接得到,就是  x/(1-x-x^2)   [这个也不难推,可以自己推推]。

于是我们可以开开心心的解出A的闭形式,发现分母是 (1-x-x^2)^2.

然后我们再把 A^3 求出来就可以直接得到答案了, 这个时候分母就是 (1-x-x^2)^6 ,于是我们就可以直接得到一个 A^3 代表的函数的递推式(最好选择让计算机多项式乘法算递推式的系数,不然手算很可能会gg),每一项之和前面的12项有关。 [至于为什么不用考虑分子->因为分子的x的次数和系数只能决定生成函数整体的伸缩和平移,而和递推式没有任何联系,所以可以直接忽略]。

所以现在就可以直接矩阵快速幂了。

是吗?

发现极限数据可能会有 10^5 级别的数据组数,总的复杂度就是 O(10^5 * 12^3 * log(10^18)),然后就凉了。

不过发现M<=100的时候这个数列的循环节特别短,所以可以直接预处理出来然后 M<=100的时候O(1)回答询问。

emmmm,这就做完了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
int M,T,NUM[13]={0,6,-9,-10,30,6,-41,-6,30,10,-9,-6,-1};
int f[233],F[233],A[12],B[12];
int ans[105][100005],C[13],len[105];
inline int add(int x,int y,const int ha){
x+=y;
return x>=ha?x-ha:x;
}
struct node{
int a[12][12];
inline void clear(){ memset(a,0,sizeof(a));}
inline void BASE(){ clear(); for(int i=0;i<12;i++) a[i][i]=1;}
node operator *(const node &u)const{
node r; r.clear();
for(int k=0;k<12;k++)
for(int i=0;i<12;i++)
for(int j=0;j<12;j++) r.a[i][j]=add(r.a[i][j],a[i][k]*(ll)u.a[k][j]%M,M);
return r;
}
}ANS,X;
ll N,ci[66]; inline void init(){
ci[0]=1;
for(int i=1;i<=60;i++) ci[i]=ci[i-1]+ci[i-1]; f[1]=f[2]=1;
for(int i=3;i<=12;i++) f[i]=f[i-1]+f[i-2];
for(int i=1;i<=12;i++)
for(int j=1;i+j<=12;j++)
for(int l=1;l+i+j<=12;l++) F[i+j+l]+=f[i]*f[j]*f[l]*i*j*l; for(M=2;M<=100;M++){
for(int i=1;i<=12;i++) C[i]=add(NUM[i]%M,M,M),ans[M][i]=add(F[i]%M,M,M);
for(int i=13;i;i++){
for(int j=1;j<=12;j++) ans[M][i]=add(ans[M][i],C[j]*(ll)ans[M][i-j]%M,M);
bool flag=1;
for(int j=1;j<=12;j++) if(ans[M][j]!=ans[M][i+j-12]){
flag=0;
break;
} if(flag){
len[M]=i-12;
break;
}
}
}
} inline void solve(){
scanf("%d%lld",&M,&N);
if(M==1) puts("0");
else if(N<=12) printf("%d\n",add(F[N]%M,M,M)*6ll%M);
else if(M<=100) printf("%d\n",ans[M][(N-1)%len[M]+1]*6ll%M);
else{
X.clear(),ANS.BASE(),N-=12;
for(int i=0;i<11;i++) X.a[i][i+1]=1;
for(int i=0;i<12;i++) X.a[i][0]=add(NUM[i+1]%M,M,M);
for(;N;N>>=1,X=X*X) if(N&1) ANS=ANS*X; for(int i=0;i<12;i++) A[i]=add(F[12-i]%M,M,M);
memset(B,0,sizeof(B));
for(int j=0;j<12;j++)
for(int l=0;l<12;l++) B[l]=add(B[l],A[j]*(ll)ANS.a[j][l]%M,M);
printf("%d\n",B[0]*6ll%M);
}
} int main(){
// freopen("sigfib.in","r",stdin);
// freopen("sigfib.out","w",stdout);
init();
scanf("%d",&T);
while(T--) solve();
return 0;
}

  

某考试 T1 sigfib的更多相关文章

  1. 考试T1总结(又CE?!)

    考试T1CE... 最近不适合考试 T1 扶苏是个喜欢一边听古风歌一边写数学题的人,所以这道题其实是五三原题.歌曲中的主人公看着墙边的海棠花,想起当年他其实和自己沿着墙边种了一排海棠,但是如今都已枯萎 ...

  2. 某考试T1 game

    题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...

  3. 某考试 T1 arg

    题目描述 给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. 输入格式 第一行两个整数 n, m. 接下来一行 m 个整数, 表示 A. 输出格式 ...

  4. 某考试 T1 lcm

    把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b) ...

  5. 2019.2.25考试T1, 矩阵快速幂加速递推+单位根反演(容斥)

    \(\color{#0066ff}{题解}\) 然后a,b,c通过矩阵加速即可 为什么1出现偶数次3没出现的贡献是上面画绿线的部分呢? 考虑暴力统计这部分贡献,答案为\(\begin{aligned} ...

  6. 2019.2.14 考试T1 FFT

    \(\color{#0066ff}{ 题目描述 }\) 衡水二中的机房里经常有人莫名其妙地犇雷,leizi很生气,决定要找出那个犇雷的人 机房有n个人,每个人都认为机房里有两个人可能会犇雷,其中第i个 ...

  7. 某考试 T1 fair (18.5.1版)

    转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于  C(n,n/2)/2 ...

  8. 某考试 T1 str

    一开始死磕sam,发现根本没法做...... 后来想了想,反正匹配子串的大部分不是sam就是 二分+hash啊,,,于是就想了想二分+hash,发现好像可以做啊! 就是假设我们要让 s1[1] 映射到 ...

  9. 某考试 T1 monopoly

    可以很容易的发现,如果选了最高的房子,那么就不能再选了:否则在左边选一坨合法的,在右边选一坨合法的,拼起来还是合法的. 所以我们可以处理出,每个数的控制区间[L,R] (保证这个区间是其他数都小于它的 ...

随机推荐

  1. 使用一位数组解决 1 1 2 3 5 8 13 数列问题 斐波纳契数列 Fibonacci

    斐波纳契数列 Fibonacci 输出这个数列的前20个数是什么? 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 使用数组实现输出数列的前30 ...

  2. docker 运行tomcat 并部署 java web项目

    以下tomcat官方镜像中tomcat:7 和tomcat:8的目录. CATALINA_BASE: /usr/local/tomcat CATALINA_HOME: /usr/local/tomca ...

  3. https原理解读

    参考:架构师必读!以图文的方式解锁 HTTPS原理,10分钟还原HTTPS真像! 对于消息安全的定义是:即使消息被中间人拦截到,中间人也没办法解读出其中的消息. 对称加密 要实现消息安全,首先想到的是 ...

  4. 如何用纯 CSS 创作背景色块变换的按钮特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XYKdwg 可交互视频教 ...

  5. perl 对ENV环境变量的使用

    1.hash 方式访问. %ENV  key为环境变量名,value为环境变量值 2.调用ENV模块 . use Env qw(PATH); print "path is $ENV{path ...

  6. Python基础-__main__

    Python基础-_main_ 写在前面 如非特别说明,下文均基于Python3 一.__main__的官方解释 参考 _main_ -- Top-level script environment ' ...

  7. python爬虫入门三:requests库

    urllib库在很多时候都比较繁琐,比如处理Cookies.因此,我们选择学习另一个更为简单易用的HTTP库:Requests. requests官方文档 1. 什么是Requests Request ...

  8. C#中何时使用dynamic

    背景:比如说,有一个方法,有很多参数,且有时候只需要其中的某几个参数,有时候需要使用全部,甚至有时候一个都不需要,这时候写一个长长的参数列表一点都不酷,且容易 出错,这时候就需要考虑C#的dynami ...

  9. PowerShell-第2章 管道

    2.1 过滤列表项或命令输出项 列出所有正在运行进程名称中包含"search"的进程,对进程名字属性使用-like操作符来比较进程的Name属性 Get-Process | Whe ...

  10. python算法-插入排序

    插入排序 一.核心思想:在一个有序的数组中,通过逐一和前面的数进行比较,找到新数的位置. 例子:数组有有一个数21 插入一个3,3<21,因此结果为 3,21 再插入一个34,34>21, ...