1. 高精度

这题略水,字符串可过,还不加压位等,操作只有BitShift和add/sub,不过编程复杂度有些高.(输出都是二进制我能说些什么...)

2. N皇后问题 (警告! 不是平时你见到的N皇后问题...是一道Hash的模拟题,N皇后的位置都给你了,就是统计)

二级标题很详细了,搜索那些解N皇后问题的千万莫戳进来.

3. Sam数

一道比较有意思的题.

题意是,给定一个k,求所有k位数中所有相邻两位数差都小于等于2的数.输出$\mod{10^9+7}$

说的不够明白.来个例子:

$2134678$ 这是一个符合要求的7阶Sam数.

$6987688$ 这个不符合,$\left| 9-6\right|=3>2$

很明显,当$k=1$时输出$10$.

当$k=2$时,很明显最高位不可为0.

于是第一位只能为$1~9$.

第二位呢?显然不可能是$0~10$.限制条件摆那儿呢!

于是想到,第二位是$0$的时候有两种可能,即$10$和$20$.这是从第一位是$0,1,2$的地方推导来的.

于是递推式很明显,$F[i,j]=\sum_{n=j-2}^{j+2}F[i-1,n]\text{While n}\in\text{0~9}$

可是数据范围:

$30\% k\le 10^6,60\% k\le 10^{12},100\% 10^{18}$

吓,$10^6 \cdot 10$都基本爆空间好么? 逗我呢?

注意到每次递推只需用到前一次的结果,用滚动数组即可. 30分到手.

但是,十的十八次位数这是要闹那样!!!

车到山前必有路(话说我当时还没想到).

注意这是线性递推.每次递推后的$F[i]$都是前一次值的线性组合($\text{linear combination}$),而这事可以用矩阵乘法解决.矩阵乘法遵守结合率,可以使用二分快速幂在$O(\log{n})$时间内求出.至于矩阵乘法的复杂度...他不会随着输入数据的上升而上升,$O(n^3)$中n恒等于10,即是常数时间,只是常数比较大.

时间复杂度是$O(1000 \cdot \log(n))=O(\log{n})$.

矩阵方法详细参数:

变换矩阵:

$tr=\left[ \begin{array} {lcr}
1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\
1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 \\
0 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 \\
0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\
0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 0 \\
0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 \\
0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 \\
0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1
\end{array} \right]$

初始向量:

$i=\left[ \begin{array} {lcr}
0 \\
1 \\
1 \\
1 \\
1 \\
1 \\
1 \\
1 \\
1 \\
1
\end{array} \right]$

递推结果为$c = tr^k \cdot i$

结果

$$sum=\sum_{i \in c}c[i]$$

注意随时求余.特判k=1.

最后一题代码(前两题还要?自己写去..)

#include "cstdio"
#define modulo 1000000007
#include "cstring"
struct mat{
long long m[10][10],i,j,k,t;
void cpy(mat b){
for(i=0;i<10;++i)
for(j=0;j<10;++j)
m[i][j]=b.m[i][j];
}
void mul(mat a){
mat tempa;
for(i=0;i<10;++i){
for(j=0;j<10;++j){
t=0;
for(k=0;k<10;++k){
t+=m[k][i]*a.m[j][k];
}
tempa.m[i][j]=t % modulo;
}
}
cpy(tempa);
}
void toUnit(){
memset(m,0,sizeof(m));
for(i=0;i<10;++i){
m[i][i]=1;//unit in matrix computation,oops...
}
}
} matt,tt;
struct vect{
long long m[10],tm;
int i,j;
void mul(mat a){
for(i=0;i<10;++i){
tm=0;
for(j=0;j<10;++j){
tm+=m[i]*a.m[i][j];
}
m[i]=tm % modulo;
}
}
} vec;
long long n,ac;
void fastPow(long long n){
if(n&1){
tt.cpy(matt);
}else{
tt.toUnit();
}
while(n>>=1){
matt.mul(matt);
if(n&1){
tt.mul(matt);
}
}
}
const long long pa[10]={0,1,1,1,1,1,1,1,1,1};
const long long pb[10][10]={
{1,1,1,0,0,0,0,0,0,0},
{1,1,1,1,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0},
{0,1,1,1,1,1,0,0,0,0},
{0,0,1,1,1,1,1,0,0,0},
{0,0,0,1,1,1,1,1,0,0},
{0,0,0,0,1,1,1,1,1,0},
{0,0,0,0,0,1,1,1,1,1},
{0,0,0,0,0,0,1,1,1,1},
{0,0,0,0,0,0,0,1,1,1}
};
int main(){
scanf("%lld",&n);
if(n==1){
printf("10\n");
return 0;
}
memcpy(vec.m,pa,sizeof(pa));
memcpy(matt.m,pb,sizeof(pb)); fastPow(n-1);//幂次修正
vec.mul(tt);
ac=0;
for(int i=0;i<10;++i){
ac+=vec.m[i];
}
printf("%lld\n",ac % modulo);
return 0;
}

常州Day4题解的更多相关文章

  1. 【2018.8.10】四连测day4 题解

    T1:给出一棵 $n$ 个节点的无根树,其中 $m$ 个节点是特殊节点,求对于任意 $i ∈ [0, m]$,包含 $i$ 个特殊节点的联通块个数$\mod 998244353$. $1<=n, ...

  2. 【2016常州一中夏令营Day4】

    小 W 走迷宫[问题描述]小 W 被小 M 困在了一个方格矩阵迷宫里,矩阵边界在无穷远处,我们做出如下的假设:a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b. 走过的格子立即塌陷无 ...

  3. 常州培训 day4 解题报告

    第一题:(简单的模拟题) 给出一个N位二进制数,有‘+’, ‘-’, ‘*’, ‘/’ 操作,分别表示加1,减1,乘2,除以2,给出M个操作,求出M个操作后的二进制数.N,M<=5000000; ...

  4. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

随机推荐

  1. excel导入数据库

    日常工作中,感觉一些基础知识需要做下笔记,可能是刚毕业的缘故吧,还保持着做笔记的习惯,但根据以往经验,纸质笔记最多保持一年,过后想找已是难过登天.电子版笔记感觉很不错,尤其是发布到网络中.笔记内容是本 ...

  2. 第五章:javascript:队列

    队列是一种列表,不同的是队列只能在末尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据.先进先出.这点和栈不一样,在栈中,最后入栈的元素反被优先处理.可以将队列想象成银行排队办理业务的人,排队在 ...

  3. 团队作业--Beta版本冲刺

    项目冲刺随笔 第一天 第二天 第三天 第四天 第五天 第六天 第七天

  4. Easyui使用记录

    一天就这搞了这几行. 1. if else 可以嵌套: 2. 子页面调用父页面js,需要使用top.父页面js的方法. <script type="text/javascript&qu ...

  5. openvpn的介绍和搭建过程

    本文摘自:http://www.linuxidc.com/Linux/2012-01/51702.htm,在这只是为了做个笔记使用

  6. BZOJ SCOI2005骑士精神

    裸IDA*,ans从1到15循环来限制搜索深度. #include<cstdio> #include<cstring> #include<algorithm> us ...

  7. grunt安装_

    grunt_构建WEBJS程序框架,. package.json是文件配置 ====〉〉〉〉 在Gruntfile.js里面会引用到. //目录下直接放node的东西 ,比如: node_module ...

  8. 处理Json数据中的日期类型.如/Date(1415169703000)/格式

    在asp.net mvc后台返回到视图中的json数据中想对数据进行操作,发现日期类型无法直接进行操作,需要转换为指定格式才行.在网上也搜了下方法也很多,觉得有点麻烦,最终使用正则搞定了,分享下: v ...

  9. 34.Android之资源文件res里drawable学习

    我们经常看到android工程资源文件res下drawable如ldpi.mdpi.hdpi.xhdpi.xxhdpi文件,今天我们学习了解下. (1)drawable-hdpi里面存放高分辨率的图片 ...

  10. hdu 1166 敌兵布阵--BIT

    BIT模版题,学完直接刷毫无压力,水的不要不要的 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...