Choosing number

【题目链接】Choosing number

【题目类型】矩阵

&题解:

这题就和已经dp极像了,所以找方程就很困难了.可以这样找:

设f(n)是前n-1个人已经完成,第n个人选>k,g(n)是前n-1个人已经完成,第n个人选<=k.

那么f(n)=f(n-1)*(m-k)+g(n-1)*(m-k) g(n)=f(n-1)*k+g(n-1)*(k-1)

最后答案是f(n)+g(n) 所以这题难就难在想公式上

【时间复杂度】\(O(logn)\)

&代码:

  1. #include <cstdio>
  2. #include <bitset>
  3. #include <iostream>
  4. #include <set>
  5. #include <cmath>
  6. #include <cstring>
  7. #include <algorithm>
  8. #include <map>
  9. #include <queue>
  10. #include <vector>
  11. using namespace std;
  12. #define INF 0x3f3f3f3f
  13. typedef long long ll;
  14. const int M= 1000000007;
  15. ll n,m,k;
  16. struct mat
  17. {
  18. ll m[4][4];
  19. }A;
  20. mat Mul(mat a,mat b)
  21. {
  22. mat c;
  23. for(int i=0;i<2;i++){
  24. for(int j=0;j<2;j++){
  25. c.m[i][j]=0;
  26. for(int k=0;k<2;k++){
  27. c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%M;
  28. }
  29. }
  30. }
  31. return c;
  32. }
  33. mat bPow(mat a,ll z)
  34. {
  35. mat un;
  36. for(int i=0;i<2;i++)for(int j=0;j<2;j++)
  37. un.m[i][j]=(i==j);
  38. while(z){
  39. if(z&1)
  40. un=Mul(un,a);
  41. a=Mul(a,a);
  42. z>>=1;
  43. }
  44. return un;
  45. }
  46. int tb[4];
  47. void Init()
  48. {
  49. tb[0]=m-k,tb[1]=k;
  50. A.m[0][0]=A.m[0][1]=m-k;
  51. A.m[1][0]=k,A.m[1][1]=k-1;
  52. }
  53. int main()
  54. {
  55. freopen("E:1.txt","r",stdin);
  56. while(cin>>n>>m>>k){
  57. Init();
  58. A=bPow(A,n-1);
  59. ll ans=0;
  60. for(int i=0;i<2;i++)
  61. for(int j=0;j<2;j++){
  62. ans=(ans+A.m[i][j]*tb[j])%M;
  63. }
  64. cout<<ans<<endl;
  65. }
  66. return 0;
  67. }

ZOJ 3690 Choosing number(矩阵)的更多相关文章

  1. ZOJ 3690 Choosing number(dp矩阵优化)

    Choosing number Time Limit: 2 Seconds      Memory Limit: 65536 KB There are n people standing in a r ...

  2. zoj 3690 Choosing number

    题意    就是说给你 N 个人站成一排,现在每个人都可以选择 1-M 中间的任意一个数字,相邻的两个人数字相同,则他必须是是 >  K 的  问方案总数: 方法    先求出递推式,然后用矩阵 ...

  3. ZOJ 3690 &amp; HDU 3658 (矩阵高速幂+公式递推)

    ZOJ 3690 题意: 有n个人和m个数和一个k,如今每一个人能够选择一个数.假设相邻的两个人选择同样的数.那么这个数要大于k 求选择方案数. 思路: 打表推了非常久的公式都没推出来什么可行解,好不 ...

  4. Choosing number ZOJ - 3690 (矩阵快速幂)

    题意:n个人站成一排,每个人任意从1——m中任意取一个数,要求相邻两个人的如果数字相同,数字要大于k. 分划思想推导表达式: 假设  i  个人时.第i个人的选择有两种一种是选择小于等于k的数,另一种 ...

  5. ZOJ 3622 Magic Number 打表找规律

    A - Magic Number Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Subm ...

  6. ZOJ 3436 July Number(DFS)

    题意   把一个数替换为这个数相邻数字差组成的数  知道这个数仅仅剩一位数  若最后的一位数是7  则称原来的数为 July Number  给你一个区间  求这个区间中July Number的个数 ...

  7. ZOJ 3233 Lucky Number

    Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...

  8. [ZOJ 3622] Magic Number

    Magic Number Time Limit: 2 Seconds      Memory Limit: 32768 KB A positive number y is called magic n ...

  9. ZOJ 3622 Magic Number(数)

    题意  假设一个正整数y满足  将随意正整数x放到y的左边得到的数z满足 z%y==0  那么这个数就是个Magic Number   给你一个范围  求这个范围内Magic Number的个数 令 ...

随机推荐

  1. [No0000C4]TortoiseSVN配置外部对比工具

    TortoiseSVN -> Settings Diff Viewer : 选中External->找到外部工具:如BCompare.路径如果有空格的最好用"双引号"括 ...

  2. 【RMAN】RMAN-05001: auxiliary filename conflicts with the target database

    oracle 11.2.0.4 运行以下脚本,使用活动数据库复制技术创建dataguard备库报错rman-005001: run{ duplicate target database for sta ...

  3. 创建ReactNative的iOS项目

    http://reactnative.cn/docs/integration-with-existing-apps/ 1.安装好ReactNative开发环境 2.安装好CocoaPods 3.创建项 ...

  4. C和C指针小记(三)-整型,char,枚举

    1.C语言基本数据类型-整型 仅有4中机泵数据类型:整型,浮点型,指针,聚合类型(数组和结构) 整型家族:字符,短整型,整型,长整型.(都分有符号[singed]和无符号[unsinged]) 短整型 ...

  5. 是时候给Xcode瘦身了

    我的Xcode 用的很久了,是从6.0之后一直慢慢升级来的. 最近CleanMyMac 一直提示磁盘空间不足... 扫描一下: 用户数据中竟然有接近17G的数据. 打开Finder使用快捷键comma ...

  6. Rabbitmq关于集群节点功能的读书笔记

    消息和队列可以指定是否持久化,如果指定持久化则会保存到硬盘上 ,不然只在内存里 普通集群模式下持久化的队列不能重建了 内存节点和磁盘节点的区别就是将元数据放在了内存还是硬盘,仅此而已,当在集群中声明队 ...

  7. 内存不够怎么办? 1.5.1 关于隔离 1.5.2 分段(Segmention) 1.5.3 分页(Paging)

    小结: 1. 内存不够怎么办?1.5.1 关于隔离1.5.2 分段(Segmention)1.5.3 分页(Paging) <程序员的自我修养——链接.装载与库>

  8. xcode工程编译错误:The maximum number of apps for free development profiles has been reached.

    真机调试免费App ID出现的问题The maximum number of apps for free development profiles has been reached.免费应用程序调试最 ...

  9. ADO多线程数据库总结

    ADO多线程数据库查询通常会出现以下问题: 1.CoInitialize 没有调用(CoInitialize was not called):所以,在使用任何dbGo对象前,必须手 调用CoIniti ...

  10. NodeJS笔记(一)-免安装设置

    之前在官网下载的nodejs win64版本4.* 最近发现nodejs都已经更新到了7.X 稳定版都升级到了6.X ,nodejs升级的真是神速了,想要升级下, 使用官方给的方法更新失败(使用的是n ...