一、题目链接

https://nanti.jisuanke.com/t/31453

二、题意

给定$N$个位置,$2^k$种颜色,让你去涂色,条件是相邻的两种颜色类型异或值的二进制表示不全为$1$(以下简称:异或值不全为$1$),注意,颜色类型的数字是$k$位,不是$32$位,也是$64$位,不要想当然。然后,要注意这$N$个位置是环形的。

三、思路

比较朴素且容易想到的做法:$dp$递推计数。

设$dp[i][0]$表示,在$i$个位置中,$i$个位置的颜色和一个位置的颜色相等的方案数;(这里的“第一个位置”待会儿解释,把题目背景想象成一排就好了);

$dp[i][1]$表示,在$i$个位置中,$i$个位置的颜色和一个位置的颜色异或值为全$1$的方案数;

$dp[i][2]$表示,在$i$个位置中,$i$个位置的颜色不是以上两种的其他选取方式(以下简称:取其他的)的方案数;

那么,初始状态:$dp[1][0]=2^k,dp[1][1]=0,dp[1][2]=0$;递推式:

$dp[i][0]=dp[i-1][0]+dp[i-1][2]$,表示:如果$i$个位置取和一个位置相等的数字,那么可以由一个位置取和一个位置相等的状态,以及由一个位置取其他数字的方案数转移过来;

$dp[i][1]=dp[i-1][1]+dp[i-1][2]$,表示:如果$i$个位置取和一个位置的颜色异或值为全$1$的数字,那么可以由一个位置取和一个位置的颜色异或值为全$1$的状态,以及由一个位置取其他的数字的方案数转移过来;

$dp[i][2]=dp[i-1][0]*(2^k-2)+dp[i-1][1]*(2^k-2)+dp[i-1][2]*(2^k-3)$,表示:如果$i$个位置取其他的数字,如果一个位置取的是和一个位置相等的数字($0$状态),那么,$i$个位置不能取和一个位置相等的,也不能取和一个位置(即和一个位置相等的那个数字)异或为全$1$的,那么只能取剩余的$2^k-2$种数字。如果一个位置取的是和一个位置的颜色异或值为全$1$的数字($1$状态),那么,$i$个位置不能取和一个位置的颜色异或值为全$1$的数字,也就是不能取和一个位置的数字相等的数字,同时也不能取和一个位置的数字异或为全$1$的,那么只能取剩余的$2^k-2$种数字。如果一个位置取的是其他数字($2$状态),那么$i$个位置不能取和一个位置的数字相等的数字,也不能取和一个位置的颜色异或值为全$1$的数字,同时也不能取和一个位置的颜色异或值为全$1$的数字,那么只能取剩余的$2^k-3$种数字。

最后的答案就是$dp[N][0]+dp[N][2]$,即最后一个位置的数字可以取和第一个个位置相等的,也可以取其他的。

注意,这个地方比较绕,如果没看懂,自己稍微理解下,再重新看一遍。

还有就是,为什么环形的可以这样变成一排?

答:其实题目中的环形所能起的作用就是让第$N$个位置和第$1$个位置产生联系,而我们这样已经把每一位和第$1$个位置的联系都搞清楚了,而且在状态转移的过程中把相邻异或为全$1$的非法状态去除掉了,所以答案没错。

另外一点,要注意的是,由一个位置的状态$1$转移过来的时候,去掉和一个位置的颜色异或值为全$1$的数字,也就是去掉和一个位置的数字相等的数字,这儿并没有和前一次$dp[i-1][0]*(2^k-2)$的计算重复,原因是:一个位置的状态不同,一个是$0$,一个是$1$。

四、代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define MAXN 1000010
;
LL dp[MAXN][];

LL qpow(LL a, LL x) {
    LL res = ;
    ) {
        )res = (res * a) % mod;
        a = (a * a) % mod;
    }
    return res;
}

int main() {
    int T, n, k;
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &n, &k);
        LL p2 = qpow(, k);
        dp[][] = p2;
        dp[][] = dp[][] = ;
        ; i <= n; ++i) {
            dp[i][] = (dp[i - ][] + dp[i - ][]) % mod;
            dp[i][] = (dp[i - ][] + dp[i - ][]) % mod;
            dp[i][] = (((dp[i - ][] + dp[i - ][]) % mod) * (p2 -  + mod) % mod + dp[i - ][] * (p2 - ) % mod) % mod;
        }
        LL ans = (dp[n][] + dp[n][]) % mod;
        printf("%lld\n", ans);
    }
    ;
}

2018ICPC网络赛(徐州站)A题题解的更多相关文章

  1. 2018ICPC网络赛(焦作站)E题题解

    一.题目链接 二.题意 给定一棵树,有四种操作: $1\ u\ v\ x$:把节点$u$到$v$路径上的所有点的权值乘以$x$: $2\ u\ v\ x$:把节点$u$到$v$路径上的所有点的权值加上 ...

  2. 2018ICPC网络赛(焦作站)K题题解

    一.题目链接 https://nanti.jisuanke.com/t/31720 二.题意 给$N$种船只,第$i$种船的载重量是$V_i$,数量是$2^{C_i}-1$.接下来有$Q$次询问,每次 ...

  3. 2013 ACM-ICPC亚洲区域赛南京站C题 题解 轮廓线DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4804 题目大意 给你一个 \(n \times m\) 的矩形区域.你需要用 \(1 \times 1 ...

  4. 2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem

    2019~2020icpc亚洲区域赛徐州站H. Yuuki and a problem 题意: 给定一个长度为\(n\)的序列,有两种操作: 1:单点修改. 2:查询区间\([L,R]\)范围内所有子 ...

  5. 2019CCPC网络预选赛 八道签到题题解

    目录 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 6702 & 6703 array 6704 K-th occurrence 6705 path 6706 huntian o ...

  6. HDU 4730 We Love MOE Girls (2013成都网络赛,签到水题)

    We Love MOE Girls Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. SCNU省选校赛第二场B题题解

    今晚的校赛又告一段落啦,终于"开斋"了! AC了两题,还算是满意的,英语还是硬伤. 来看题目吧! B. Array time limit per test 2 seconds me ...

  8. Building Fire Stations 39届亚洲赛牡丹江站B题

    题意:      给你一棵树,让你再里面选取两个点作为**点,然后所有点的权值是到这两个点中最近的那个的距离,最后问距离中最长的最短是多少,输出距离还有那两个点(spj特判). 思路:      现场 ...

  9. hdu 5038 (2014北京网络赛G 排序水题)

    题意:有n个数字,带入10000 - (100 - ai) ^ 2公式得到n个数,输出n个数中频率最大的数,如果有并列就按值从小到大都输出输出,如果频率相同的数字是全部的n个数,就输出Bad....题 ...

随机推荐

  1. cocos2dx 不同平台上加载文件

    原文转自:http://blog.sina.com.cn/s/blog_62b2318d0101eozt.html cocos2dx在不同平台上读取资源文件时的处理方式是不同的. 在ios下,程序调用 ...

  2. 解决Ubuntu下添加Log却无法输出(高通平台)

    1.首先考虑到的是你所添加Log的位置确实没有被调用或者在调用前发生异常终止掉了. 2.你修改后没有进行编译或者没有push/install 3.如果你当前的系统版本是User版本,你在push的时候 ...

  3. HDU 1592 Half of and a Half(大数)

    Half of and a Half Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  4. webbench-1.5_hacking

    /**************************************************************************** * * webbench-1.5_hacki ...

  5. BZOJ3925: [Zjoi2015]地震后的幻想乡【概率期望+状压DP】

    Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...

  6. utf-8编码的csv文件,用excel打开乱码,解决办法,在输出前加 0xEF,0xBB,0xBF三个char

    转自 http://blog.csdn.net/zcmssd/article/details/6086649 是由于输出的CSV文件中没有BOM. 什么是BOM? 在UCS 编码中有一个叫做”ZERO ...

  7. 实验吧—密码学——WP之 传统知识+古典密码

    仔细读题,发现有价值的信息: 几个不同的年份:“+甲子”:key值结构 首先我们并不知道这些年份在这里代表着什么,那么我们就去百度一下发现了如下所示的六十甲子顺序表 而在表中每个年份前都有数字,将他们 ...

  8. hdu2602 DP (01背包)

    题意:有一个容量 volume 的背包,有一个个给定体积和价值的骨头,问最多能装价值多少. 经典的 01 背包问题不谈,再不会我就要面壁了. 终于有一道题可以说水过了 ……心好累 #include&l ...

  9. matplotlib的颜色及线条控制

    refer to: https://www.cnblogs.com/darkknightzh/p/6117528.html

  10. java 多线程之:synchronized

    synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在. 当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,syn ...