zoukankan      html  css  js  c++  java
  • hdu 2276 Kiki & Little Kiki 2

    http://acm.hdu.edu.cn/showproblem.php?pid=2276

      还是矩阵快速幂的题,将异或的操作转换成矩阵乘法。1y!

    代码如下:

    View Code
      1 #include <cstdio>
      2 #include <cstring>
      3 #include <cassert>
      4 #include <algorithm>
      5 
      6 using namespace std;
      7 
      8 const int maxSize = 100;
      9 const int initMod = 1E9 + 7;
     10 int curSize = maxSize;
     11 int curMod = initMod;
     12 
     13 struct Matrix {
     14     int val[maxSize][maxSize];
     15 
     16     Matrix(bool ONE = false) {
     17         for (int i = 0; i < curSize; i++) {
     18             for (int j = 0; j < curSize; j++) {
     19                 val[i][j] = 0;
     20             }
     21             if (ONE) val[i][i] = 1;
     22         }
     23     }
     24 
     25     void print(int _l = curSize, int _w = curSize) {
     26         for (int i = 0; i < _l; i++) {
     27             for (int j = 0; j < _w; j++) {
     28                 if (j) putchar(' ');
     29                 printf("%d", val[i][j]);
     30             }
     31             puts("");
     32         }
     33         puts("~~");
     34     }
     35 };
     36 
     37 Matrix operator * (Matrix &_a, Matrix &_b) {
     38     Matrix ret = Matrix();
     39 
     40     for (int i = 0; i < curSize; i++) {
     41         for (int k = 0; k < curSize; k++) {
     42             if (_a.val[i][k]) {
     43                 for (int j = 0; j < curSize; j++) {
     44                     ret.val[i][j] += _a.val[i][k] * _b.val[k][j];
     45                     ret.val[i][j] %= curMod;
     46                 }
     47             }
     48         }
     49     }
     50 
     51     return ret;
     52 }
     53 
     54 Matrix operator ^ (Matrix &_a, int _p) {
     55     Matrix __a = _a, ret = Matrix(true);
     56 
     57     while (_p) {
     58         if (_p & 1) {
     59             ret = ret * __a;
     60         }
     61         __a = __a * __a;
     62         _p >>= 1;
     63     }
     64 
     65     return ret;
     66 }
     67 
     68 char *deal(int n) {
     69     char *buf = new char[101];
     70     int p = 0;
     71 
     72     scanf("%s", buf);
     73     curSize = strlen(buf);
     74 
     75     Matrix Base = Matrix(), op = Matrix(true);
     76 
     77     while (buf[p]) {
     78         Base.val[0][p] = buf[p] - '0';
     79         p++;
     80     }
     81     for (int i = 1; i < curSize; i++) {
     82         op.val[i - 1][i] = 1;
     83     }
     84     op.val[curSize - 1][0] = 1;
     85 //    op.print();
     86 
     87     op = op ^ n;
     88     Base = Base * op;
     89 
     90     p = 0;
     91     while (buf[p]) {
     92         buf[p] = Base.val[0][p] + '0';
     93         p++;
     94     }
     95 
     96     return buf;
     97 }
     98 
     99 int main() {
    100     int n;
    101 
    102     curMod = 2;
    103     while (~scanf("%d", &n)) {
    104         printf("%s\n", deal(n));
    105     }
    106 
    107     return 0;
    108 }

    ——written by Lyon

  • 相关阅读:
    k8s学习
    k8s学习
    k8s学习
    Linux 常用命令(持续补充)
    通过一个小故事,理解 HTTPS 工作原理
    Spring Cloud 微服务架构全链路实践
    Spring Cloud Eureka 使用 IP 地址进行服务注册
    RabbitMQ 消息顺序、消息幂等、消息重复、消息事务、集群
    Spring Boot 实现 RabbitMQ 延迟消费和延迟重试队列
    RabbitMQ 集群原理和完善
  • 原文地址:https://www.cnblogs.com/LyonLys/p/hdu_2276_Lyon.html
Copyright © 2011-2022 走看看