hdu 2276 Kiki & Little Kiki 2

点击打开hdu 2276

思路: 矩阵快速幂

分析:

1 题目给定一个01字符串然后进行m次的变换,变换的规则是:如果当前位置i的左边是1(题目说了是个圆,下标为0的左边是n-1),那么i就要改变状态0->1 , 1->0

   比如当前的状态为100101那么一秒过后的状态为010111

2 假设0/1串的长度为n,保存在a数组,下标从0开始

   根据上面的规则我们发现可以得出一秒过后的状态即为a[i] = (a[i]+a[i-1])%2 , 对于a[0] = (a[0]+a[n-1])%2

   那么我们就可以就能够找到递推的式子

   1 1 0 0....     a0        a1

   0 1 1 0...  *  a1   =   a2

   ..........1 1     .....      .....

   1 0 0.....1     an-1    a0

3 但是我们最后要求的是a0 a1 .... an-1 , 所以我们应该把矩阵的第一行和最和一行调换一下,然后进行m次的快速幂即可

4 由于最后的结果是mod2的结果,因此我们可以把所有的*和+运算全部改成&和^

5 由于初始的矩阵是一个循环同构的矩阵,因此我们可以每次先求出第一行,然后在递推出第二行,那么这样就从O(n^3)降到O(n^2)

代码:

/************************************************
 * By: chenguolin                               *
 * Date: 2013-08-30                             *
 * Address: http://blog.csdn.net/chenguolinblog *
 ************************************************/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 105;

int n , len;
char str[MAXN];

struct Matrix{
    int mat[MAXN][MAXN];
    Matrix operator*(const Matrix& m)const{
        Matrix tmp;
        for(int i = 0 ; i < len ; i++){
            tmp.mat[0][i] = 0;
            for(int j = 0 ; j < len ; j++)
                tmp.mat[0][i] ^= (mat[0][j]&m.mat[j][i]);
        }
        for(int i = 1 ; i < len ; i++)
            for(int j = 0; j < len ; j++)
                tmp.mat[i][j] = tmp.mat[i-1][(j-1+len)%len];
        return tmp;
    }
};

void solve(){
    len = strlen(str);

    Matrix m , ans;
    memset(m.mat , 0 , sizeof(m.mat));
    for(int i = 1 ; i < len ; i++)
        m.mat[i][i] = m.mat[i][i-1] = 1;
    m.mat[0][0] = m.mat[0][len-1] = 1;

    memset(ans.mat , 0 , sizeof(ans.mat));
    for(int i = 0 ; i < len ; i++)
        ans.mat[i][i] = 1;
    while(n){
        if(n&1)
            ans = ans*m;
        n >>= 1;
        m = m*m;
    }
    for(int i = 0 ; i < len ; i++){
        int x = 0;
        for(int k = 0 ; k < len ; k++)
            x ^= ans.mat[i][k]&(str[k]-'0');
        printf("%d" , x);
    }
    puts("");
}

int main(){
    while(scanf("%d%s" , &n , str) != EOF)
        solve();
    return 0;
}
时间: 2024-12-26 23:09:35

hdu 2276 Kiki &amp; Little Kiki 2的相关文章

hdu 2275 Kiki &amp;amp; Little Kiki 1

点击打开hdu 2275 思路: multiset的应用 分析: 1 我们把所有的插入x全部插入到multiset 2 碰到删除的时候x的时候,我们就去判断   如果集合为空或者集合的第一个元素大于x,那么肯定是没有的删除的   否则我们去找x的位置,如果找到直接删除,如果没有找到那么我们先   插入x,然后再去找x的位置,那么假设找到的位置为it,那么it的前一个位置   肯定比x小,那这样同时删掉两个即可 代码: #include<set> #include<cstdio> #

矩阵快速幂专题【完结】

第一题 hdu 1757 A Simple Math Problem 点击打开链接 思路:矩阵快速幂 分析: 1 最简单的矩阵快速幂的题目,直接利用矩阵求解即可 点击打开查看代码 第二题 hdu 1575 Tr A 点击打开hdu 1575 思路: 矩阵快速幂 分析: 1 题目给定一个n*n的矩阵要求矩阵的k次幂之后的矩阵的对角线的和 2 矩阵快速幂的裸题 点击打开查看代码 第三题 hdu 2604 Queuing 点击打开hdu 2604 思路: 递推+矩阵快速幂 分析; 1 根据题目的意思,

国内类Kik类服务汇总

Kik是今年很收关注的一个服务,其也入选了今年ChinaMode最受关注国外应用,Kik上线15天便用户超过百万,并且到去年年底Kik 的数量从每分钟 2000 条上升到 3000 条,并且用户数量也达到了300万,最近将支持彩信和群聊.Kik的出现也一度引发了对于互联网/http://www.aliyun.com/zixun/aggregation/11574.html">移动互联网用户关系的思考. 尽管很多人对于这样一个在国外很火的应用在国内的前景抱有不一样的看法,不过国内还是出现了很

hdu 2852 KiKi&#039;s K-Number

点击打开hdu 2852 思路: 树状数组 分析: 1 题目给定三种操作: 0 x 表示把x插入容器 ; 1 x 表示删除一个x如果没有x则输出 No Elment! ; 2 a k 表示比a大的数中的第k大的数 如果没有输出No Find! 2 我们先来看一下树状数组的功能,树状数组能够在在logN的时间内求出某段区间的和,那么对于2 a k这种操作我们可以看成是求是否有x满足[a,x]这个区间的和为k,那么这样就变成了树状数组的求和问题了.那我们再来考虑插入和删除操作,插入一个x相当于更新树

hdu 2147 kiki&amp;#39;s game

http://acm.hdu.edu.cn/showproblem.php?pid=2147 这是一个巴什博弈的题,当两个数至少有一个数是偶数先手必胜 代码如下: #include <iostream> #include <cstdio> using namespace std; int main() { int m,n; while(cin>>m>>n,m,n) { if(m%2 && n%2) puts("What a pity

Kik、米聊、微信、Kiki大评测

Kik.米聊.微信.Kiki这些基于手机通讯录的短信聊天软件,是采用无线网络来实现短信功能的,只消耗网络流量,运营商将不再收取短信资费.无线网络有GPRS.3G.CMWAP.WiFi等制式,对于常见的GPRS,最低需要5元就可以享受到包月50兆的服务.而仅仅1兆即可发送3000条短信! 但是这么多的手机短信聊天软件,我们该怎么选呢?那么接下来我们就对基于手机通讯录的短信聊天软件进行一个横向评测,找出最好用.最实用的聊天软件. 参选软件介绍 Kik:2010年10月19日发布的一款国外软件,号称短

HDOJ(HDU) 2113 Secret Number(遍历数字位数的每个数字)

Problem Description 有一天, KIKI 收到一张奇怪的信, 信上要KIKI 计算出给定数各个位上数字为偶数的和. eg. 5548 结果为12 , 等于 4 + 8 KIKI 很苦恼. 想请你帮忙解决这个问题. Input 输入数据有多组,每组占一行,只有一个数字,保证数字在INT范围内. Output 对于每组输入数据,输出一行,每两组数据之间有一个空行. Sample Input 415326 3262 Sample Output 12 10 简单题. 注意输出格式就行!

HDU 2147

kiki's game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 40000/1000 K (Java/Others)Total Submission(s): 3808 Accepted Submission(s): 2210 Problem Description Recently kiki has nothing to do. While she is bored, an idea appears in his mind, sh

hdu 1527

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 hint:威佐夫博弈 基本类似于模板 #include <iostream> #include <cmath> #include <cstdio> using namespace std; const double q = (1 + sqrt(5.0)) / 2.0; // 黄金分割数 int Wythoff(int a, int b) { if (a > b)