题目链接:
校赛 1006 wuli通通和Fibonacci
题意:
计算a[n]=f[n]∗(nm)的前k项和mod23333。f[n]是Fibonacci数列,f[1]=f[2]=1,k<=1e9,m<=40计算a[n]=f[n]*(n^m)的前k项和mod 23333。f[n]是Fibonacci数列,f[1]=f[2]=1,k
分析:
这样明显的复杂递推公式题而且要求mod23333一定和矩阵快速幂有关,所以问题就在构造矩阵上了。再读题目发现m<=40,m比较小,所以构造的矩阵可能和m有关。而m在递推式中又是和n挂在一起的,那就要联想到如何构造矩阵来由(n−1)m得到nm,由组合数的知识我们知道这样明显的复杂递推公式题而且要求mod23333一定和矩阵快速幂有关,所以问题就在构造矩阵上了。 再读题目发现m

nm=((n−1)+1)m=C[m][m]∗(n−1)m+C[m][m−1]∗(n−1)(m−1)+C[m][m−2]∗(n−1)(m−2)+...+C[m][1]∗(n−1)(1)+C[m][0]∗(n−1)(0);其中C[i][j]是组合数n^m=((n-1)+1)^m=C[m][m]*(n-1)^m+C[m][m-1]*(n-1)^(m-1)+C[m][m-2]*(n-1)^(m-2)+...+C[m][1]*(n-1)^(1)+C[m][0]*(n-1)^(0);其中C[i][j]是组合数

那么就可以构造出如下矩阵了:

| C[m][0]    0         0        0    ...    0   |   | (n-1)^(0)  |   | n^0 |
| C[m][0]  C[m][1]     0        0    ...    0   |   | (n-1)^(1)  |   | n^1 |
| C[m][0]  C[m][1]  C[m][2]     0    ...    0   | * | (n-1)^(2)  | = | n^2 |
| C[m][0]  C[m][1]  C[m][2]  C[m][3] ...    0   |   | (n-1)^(3)  |   | n^3 |
|    .   .   .      .   .  .    .    .    . .   |   | .  .   .  .|   | . . |
| C[m][0]  C[m][1]  C[m][2]  C[m][3] .. C[m][m] |   | (n-1)^(m)  |   | n^m |

再想办法将Fibonacci数列添加进去,一开始我是想在构造一个右乘矩阵,如下:

| C[m][0]     0          0         0    ...       0   |    | f[n-1](n-1)^(0)  f[n-1](n-2)^(0) |
| C[m][0]   C[m][1]      0         0    ...       0   |    | f[n-1](n-1)^(1)  f[n-1](n-2)^(1) |
| C[m][0]   C[m][1]   C[m][2]      0    ...       0   |  * | f[n-1](n-1)^(2)  f[n-1](n-2)^(2) |
| C[m][0]   C[m][1]   C[m][2]   C[m][3] ...       0   |    | f[n-1](n-1)^(3)  f[n-1](n-2)^(3) |
|    .   .    .    .   .   .   .    .    .    .   .   |    | .  .   .  .       .    .   .  .  |
| C[m][0]   C[m][1]   C[m][2]   C[m][3] ...   C[m][m] |    | f[n-1](n-1)^(m)  f[n-1](n-2)^(m) |
|         |
      |  1  1   |  *  |         |
      |         |  =
      |  1   0  |
      |         |
| f[n](n-1)^(0)  f[n-1](n-1)^(0) |
| f[n](n-1)^(1)  f[n-1](n-1)^(1) |
| f[n](n-1)^(2)  f[n-1](n-1)^(2) |
| f[n](n-1)^(3)  f[n-1](n-1)^(3) |
| .  .  .  .  .  .  .  .  .  . . |
| f[n](n-1)^(m)  f[n-1](n-1)^(m) |

但是这样就发现有一个问题那就是我无法再通过添加一维的方法将a[n]的和这一项添加进中间矩阵。
后来又想了到了一个方法,可以将上面的中间(m+1)2阶矩阵拉伸成(2(m+1))*阶矩阵,也就是这样:

| f[n-1](n-1)^(0) |
| f[n-1](n-2)^(0) |
| f[n-1](n-1)^(1) |
| f[n-1](n-2)^(1) |
| f[n-1](n-1)^(2) |
| f[n-1](n-2)^(2) |
| f[n-1](n-1)^(3) |
| f[n-1](n-2)^(3) |
|  .  .   .  .    |
|  .    .   .  .  |
| f[n-1](n-1)^(m) |
| f[n-1](n-2)^(m) |

然后再将左面的矩阵也跟着变一下:

| C[m][0]   C[m][0]      0         0    ...       0       0    |
| C[m][0]      0         0         0    ...       0       0    |
| C[m][0]   C[m][0]   C[m][1]   C[m][1] ...       0       0    |
| C[m][0]   C[m][1]      0         0    ...       0       0    |
|    .   .    .    .   .   .   .    .    .    .   .       0    |
| C[m][0]   C[m][0]   C[m][1]   C[m][1] ...   C[m][m]  C[m][m] |
| C[m][0]      0      C[m][1]      0    ...   C[m][m]     0    |

最后再在最后一维各添加一行(注意维数都变了):

|   S[n-2]  |
和
| C[m][0]   C[m][0]   C[m][1]   C[m][1] ...   C[m][m]  C[m][m]  1 | 

就行了。【好累。。。o(╯□╰)o】

#include <cstdio>
#include <cstring>
using namespace std;const long long mod=23333;
const int maxn=45;
int T,m,k;
long long c[maxn][maxn];struct Matrix{int row,col;long long data[maxn*2][maxn*2];
};inline void calc()
{for(int i=0;i<=42;i++){for(int j=0;j<=i;j++){if(j==0) c[i][j]=1;else c[i][j]=c[i][j-1]*(i-j+1)/j;}}
}inline Matrix mul(Matrix a,Matrix b)
{Matrix ans;ans.row=a.row,ans.col=b.col;memset(ans.data,0,sizeof(ans.data));for(int i=1;i<=ans.row;i++){for(int j=1;j<=ans.col;j++){for(int k=1;k<=a.col;k++){ans.data[i][j]+=a.data[i][k]*b.data[k][j]%mod;ans.data[i][j]%=mod;}}}return ans;
}inline Matrix quick_power(Matrix a,int time)
{Matrix ans,tmp=a;ans.row=ans.col=a.row;memset(ans.data,0,sizeof(ans.data));for(int i=1;i<=ans.row;i++) ans.data[i][i]=1;while(time){if(time&1) ans=mul(ans,tmp);tmp=mul(tmp,tmp);time>>=1;}return ans;
}int main()
{//freopen("1006in.txt","r",stdin);//freopen("1006out.txt","w",stdout);calc();scanf("%d",&T);while(T--){scanf("%d%d",&k,&m);if(k==1){printf("1\n");continue;}Matrix ans,tmp;ans.row=ans.col=tmp.row=2*m+3,tmp.col=1;memset(ans.data,0,sizeof(ans.data));for(int i=1;i<=m+1;i++){for(int j=1;j<=i;j++){ans.data[2*i-1][2*j-1]=ans.data[2*i-1][2*j]=ans.data[2*i][2*j-1]=c[i-1][j-1];ans.data[2*i][2*j]=0;}}for(int i=1;i<=m+1;i++) ans.data[2*m+3][2*i-1]=ans.data[2*m+3][2*i]=c[m][i-1];ans.data[2*m+3][2*m+3]=1;for(int i=1;i<=m*2+2;i+=2) {tmp.data[i][1]=1;tmp.data[i+1][1]=0;}tmp.data[2*m+3][1]=1;ans=quick_power(ans,k-1);tmp=mul(ans,tmp);printf("%I64d\n",tmp.data[2*m+3][1]%mod);}return 0;
}

三月校赛1006 wuli通通和Fibonacci (a[n]=f[n]*(n^m)的前k项和)相关推荐

  1. 2016 多校赛3 A 水 B 期望,规律 C 各种博弈 J 物理题,积分 K 暴力,水

    2016 Multi-University Training Contest 3 A - Sqrt Bo 题意:给一个数 n,问n要多少次平方后化为1,如果超过5次输出"TAT". ...

  2. 求Fibonacci(斐波那契)数列的的前n项

    1.Fibonacci(斐波那契)数列的定义规律:第一项a1=0,第二项a2=1,从第三项起,每一项都等于前面两项之和. 2.使用a1,a2,a3进行迭代 代码 #include using name ...

  3. 2018 java蓝桥杯校赛题目

    1.[问题描述] 100 可以表示为带分数的形式:100 = 3 + 69258 / 714 还可以表示为:100 = 82 + 3546 / 197 注意特征:带分数中,数字1~9分别出现且只出现一 ...

  4. [置顶]2010年东北大学ACM程序设计竞赛冬季校赛题解

    8题只做出4题比较easy的题,而且做得挺麻烦,看来还要多练练. AC的题如下 NEUOJ  1112 I Love Apple Description So many people love app ...

  5. 2017校赛 问题 F: 懒人得多动脑

    题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...

  6. 关于安徽赛区推广校赛的实施办法

    关于安徽赛区 推广校赛的实施办法 全国组委会:   安徽赛区作为第一个省级赛区自2010年举办至今,受到安徽省教育厅和安徽各高校高度认可,是安徽省教育厅重点支持的大学生学科和技能竞赛A类赛事.但安徽赛 ...

  7. 第18届浙江大学校赛 Mergeable Stack

    The 18th Zhejiang University Programming Contest Sponsored by TuSimple 第18届浙江大学校赛的c题 解析:起先是用stack写的模 ...

  8. 21-5-22校赛J 下围棋

    21-5-22校赛J 下围棋 给出一个节点个数为n的树,其根节点为1,两个人轮流操作,每一次操作可以选择一个非根节点,删除这个节点及其子树,当一个人无法进行操作的时候,他就输掉了.问后手是必胜还是必败 ...

  9. 21-5-22校赛G 自行车调度

    21-5-22校赛G 自行车调度 n个点,m条边的无向带正权图(编号1到n).每个点初始有a[i](0<=a[i]<=1e5,1<=i<=n)辆自行车,自行车管理员可以花费一个 ...

  10. BZOJ 3093: [Fdu校赛2012] A Famous Game

    3093: [Fdu校赛2012] A Famous Game Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 248  Solved: 133 [Su ...

最新文章

  1. js上传文件,上传表单demo 包含后端php
  2. git fetch与git pull的区别
  3. python黑客攻防入门下载-Python键盘钩取的自我理解(来源于《Python黑客攻防入门》)...
  4. 1、请简述DNS的作用,并说明当你输入网址“www.nxtc.edu.cn“按下回车后,DNS是怎么工作的?(关键步骤可以给出相应图示) 2、详细描述域名劫持攻击的过程及防御方式。
  5. C++实现黑客帝国流星雨效果
  6. BeetleX之Websocket服务使用
  7. java注册中心nacos_spring-cloud整合nacos做注册中心
  8. 无锡计算机硬件培训,无锡锡山办公软件电脑基础培训随到随学 学会为止
  9. 罗永浩的带货直播你看了吗?
  10. Python+networkx 网络可视化方法
  11. Shodan Hacking
  12. 第 13 章 一 垃圾回收概述
  13. 西电微电子考研初试经验贴
  14. 定义字符串的两种方式
  15. 爆料!华为胡玲或入职头条,职场人该如何说“真话”?
  16. python数据分析建模-十分钟搞懂“Python数据分析”
  17. python modbus tk 库_python modbus_tk库 学习记录
  18. 金科惊魂830天:城门外的野蛮人与城楼里的危机
  19. ppt密码忘了怎么打开
  20. Angular+Node实战之登陆注册

热门文章

  1. Activity详解三 启动activity并返回结果 转载 https://www.cnblogs.com/androidWuYou/p/5886991.html...
  2. 计算机专业职称入深户,深圳市人才引进入深户新政策
  3. coreldraw橙子怎么画_CorelDRAW(CDR)设计绘制质感的橙子和冰块实例教程
  4. [转]内向的人如何建立人际网络
  5. SeleniumWebdriver参数化详解
  6. 旋转矩阵之到底顺时针还是逆时针
  7. linux查看gc日志,GC通用日志解读
  8. 如何在透视表中同时显示客户编码和客户名称
  9. lifestyle HTML5酷站欣赏
  10. AndroidFTP客户端-FTP管家源码