[51nod1197]字符串的数量 V2
用N个不同的字符(编号1 - N),组成一个字符串,有如下要求:
(1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符。如果不作为结尾字符而是中间的字符,则该字符后面可以接任意字符。
(2) 对于编号为i的字符,如果2 * i <= n,则该字符不可以作为结尾字符。作为中间字符,那么后面接的字符编号一定要 >= 2 * i。
问有多少长度为M且符合条件的字符串,由于数据很大,只需要输出该数Mod 10^9 + 7的结果。
例如:N = 2,M = 3。则abb, bab, bbb是符合条件的字符串,剩下的均为不符合条件的字符串。
Input
输入2个数,N, M中间用空格分割,N为不同字符的数量,M为字符串的长度。(2 <= N <= 10^6, 2 <= M <= 10^18)
Output
输出符合条件的字符串的数量。由于数据很大,只需要输出该数Mod 10^9 + 7的结果。
想半天不会做然后跑去瞄题解。。
首先,一个合法的字符串显然是由若干个合法的“链”组成的。
链的定义就是:从一个字母开始连,后面每个字母编号必须大于等于前一个的2倍,这样尽可能的连接下去。
所谓尽可能连接下去的意思是,链的最后一个字母编号i必须满足2 * i > n ,这样后面不能接东西了,并且只有这样的链才合法。
对于每个合法字符串,划分成合法链的方法是唯一的。
那么因为n不大,所以链的最大长度也很小...
设f[i][j]表示长度为i的链,链末尾编号为j的方案数。这个可以直接算出来,也就可以得到g[i]表示长度为i的链的所有方案数。
设ans[i]表示长度为i的合法字符串数,那么ans[i]=sum{ ans[i-x]*g[x] },1<=x<=链的最大长度。这个直接矩乘。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
//#define d double
#define ld long double
const int maxn=,modd=;
struct mat{int mp[][];}a,c;
int f[][maxn],af[][maxn];
int i,j,k,n,m,n1,len; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while(rx<''&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>='')ra=ra*+rx-,rx=getchar();return ra*fh;
} inline void MOD(int &x){if(x>=modd)x-=modd;} mat operator *(mat a,mat b){
mat c;register int i,j,k;
for(i=;i<=len;i++)for(j=;j<=len;j++)for(c.mp[i][j]=,k=;k<=len;k++)
c.mp[i][j]=(c.mp[i][j]+1ll*a.mp[i][k]*b.mp[k][j])%modd;
return c;
}
int main(){ll m;
n=read(),scanf("%lld",&m);
for(i=;(<<i)<=n;i++);len=i,n1=n>>; for(i=n;i;i--)f[][i]=i>n1,af[][i]=af[][i+]+f[][i];
a.mp[][]=af[][];//printf(" %d\n",af[0][1]); bool now=,pre=;int premx=n;
for(i=;i<=len;i++,std::swap(now,pre)){
premx>>=,af[now][premx+]=;
for(j=premx;j;j--)MOD(af[now][j]=af[now][j+]+(f[now][j]=af[pre][j<<]));//,printf("%d %d f:%d\n",i,j,f[now][j]);
a.mp[][i]=af[now][];
}
for(i=;i<=len;i++)a.mp[i][i-]=;
for(i=;i<=len;i++)c.mp[i][i]=; while(m){
if(m&)c=c*a;
if(m>>=)a=a*a;
}
printf("%d\n",c.mp[][]);
}
[51nod1197]字符串的数量 V2的更多相关文章
- 51nod 1197 字符串的数量 V2(矩阵快速幂+数论?)
接上一篇,那个递推式显然可以用矩阵快速幂优化...自己随便YY了下就出来了,学了一下怎么用LaTeX画公式,LaTeX真是个好东西!嘿嘿嘿 如上图.(刚画错了一发...已更新 然后就可以过V2了 or ...
- 51nod1196 字符串的数量
用N个不同的字符(编号1 - N),组成一个字符串,有如下要求:(1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以接 ...
- @51nod - 1196/1197/1198@ 字符串的数量
目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @accepted code@ @details@ @description@ ...
- 用map来统计数组中各个字符串的数量
1.背景 想要统计这一个字符串数组中每一个非重复字符串的数量,使用map来保存其key和value.这个需求在实际开发中经常使用到,我以前总是新建一个空数组来记录不重复字符串,并使用计数器计数,效率低 ...
- 51nod 1196 字符串的数量(DP+数论?)
这题好像是神题...V1 V2 V3分别涵盖了51nod 5级算法题 6级算法题 难题 讨论区的曹鹏神牛好强啊...一种做法切了V1 V2 V3,而且做法是一步一步优化的 还没去看优化的部分,未优化已 ...
- 51Nod 1196 字符串的数量
用N个不同的字符(编号1 - N),组成一个字符串,有如下要求: (1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以 ...
- 51nod【1196】字符串的数量
超级神题! 有n种字符,若此种字符的编号( \(1\) ~ \(n\)),\(i*2>n\),则他后面可接任意字符.若不是,则他后面接的字符编号至少要是他的两倍. 问长度为m的字符串的个数. 这 ...
- 51nod 1132 覆盖数字的数量 V2
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1132 题意是给定a,b,l,r求[l,r]内有几个整数可以表示成ax+b ...
- Js字符串按数量分组
代码: function group(ss,step) { var r = []; function doGroup(s) { if (!s) return; r.push(s.substr(0, s ...
随机推荐
- less基础语法
变量 //->LESS代码 @link-color: #428bca; @link-color-hover: darken(@link-color, 10%); a { color: @link ...
- iOS 字体设置,字体类型展示
字体设置: [UIFont fontWithName:@"Helvetica" size:17.0]]; 字体名字,如图 UIFont fontWithName 后不知道字体的名字 ...
- Win10关闭某程序的通知的方法
一.点击右下角的通知图标. 二.点击所有通知. 三.点击系统 四.点击通知和操作 五.下拉,看到:获取来自这些发送者的通知 六.关闭自己想关闭通知的程序即可.
- 排查程序死循环,死锁的方法 ——pstack
pstack命令可显示每个进程的栈跟踪,pstack $pid即可,pstack命令须由$pid进程的属主或者root运行. 这次出现cpu占比100%的情况,但看memory占比,并无异常,怀疑是某 ...
- 视觉SLAM
SLAM:Simultaneous Localization And Mapping.中文:同时定位与地图重建. 它是指搭载特定传感器的主体,在没有实验先验信息的情况下,于运动过程中建立环境的模型,同 ...
- 阅读MDN文档之基本盒模型(三)
Box properties Margin collapsing Adjacent siblings(相邻兄弟) Parent and first/last child Empty blocks Ac ...
- IT服务(运维)管理实施的几个要点--第二章 人员和组织架构
子曰"没有合适的人" 在流程化的管理模式下,最容易步入的一个误区是按流程设计一个"理想的"组织架构,然后对应于这个架构对人员进行评估.培养,甚至是更换.我见过很 ...
- [ZJOI2015]地震后的幻想乡
题目传送门 SOL:不会积分的我瑟瑟发抖. 所以我选择状压DP. 我们有以下一个dp状态: f[S][i],S表示点集,i表示这个点集向外联了i条边. 那么答案就是f[(1<<n)-1][ ...
- Zabbix 监控数据库MSSqlServer
zabbix 通过ODBC连接sql server,并通过odbc 获取数据从数据库: 配置如下: 在zabbix-server端 执行下面命令: # yum -y install freetds ...
- Python day 7(1) 模块
一:模块 1 在Python中,一个.py文件就称之为一个模块(Module) 2 Python的好处,优点: a 提高了代码的可维护性 b 当一个模块编写完毕,就可以被其他地方引用.我们在编写程 ...