您的位置:首页 > 其它

2016计蒜之道初赛第四场-----遗失的支付宝密码(简单)【暴力Dfs】

2016-06-11 17:12 295 查看
 某用户忘记了支付宝的登录密码,他只记得自己的密码满足以下几个条件:

密码中最多有 mm 种不同的字符;

密码的最大长度为 nn,但不能为空;

密码的任意一个前缀都 不是 一个 squaresquare。squaresquare 的定义如下:

a. 字符串的长度 ll 是偶数;

b. 字符串的长度为 \frac{l}{2}

​2



​l

​​  的前缀和长度为 \frac{l}{2}

​2



​l

​​  的后缀相同。

比如,abab 是一个 squaresquare,而 abba 则不是。

请问符合条件的密码有多少个。因为数量很多,只需要输出总个数对 2^{32}2

​32

​​  取模的结果即可。

输入格式

输入第一行包含两个整数 n,m(n,m \geq 1)n,m(n,m≥1),nn 为密码的最大长度,密码中最多有 mm 种不同的字符。

对于简单版本:n \leq 5n≤5,m \leq 10m≤10;

对于中等版本:n \leq 40n≤40,m \leq 10^9m≤10

​9

​​ ;

对于困难版本:n \leq 100n≤100,m \leq 10^9m≤10

​9

​​ 。

输出格式

输出一个整数,表示满足条件的密码数量,结果对 2^{32}2

​32

​​  取模。

样例输入1

3 2

样例输出1

8

样例输入2

4 5

样例输出2

605

提示信息

对于第一组样例,假设字符集为 \{a,b\}{a,b}。长度为 33 以内且符合条件的密码有如下 8 个:

a

b

ab

ba

aba

abb

baa

bab

思路:因为n和m都比较小,我们以n为深度,直接来爆搜即可,每一次组成的字符串我们都直接对其判断是否可行,如果可行,统计起来,输出即可。

Ac代码:

#include<stdio.h>
#include<string.h>
using namespace std;
int a[100000];
int main()
{
int n;
while(~scanf("%d",&n))
{
int output=0;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
if(n%2==1)
{
for(int i=0;i<n;i+=2)
{
output+=a[i];
}
printf("%d\n",output);
}
else
{
if(a[n-1]>a[n-2])
{
for(int i=0;i<n-2;i+=2)
{
output+=a[i];
}
output+=a[n-1];
}
else
{
for(int i=0;i<n;i+=2)
{
output+=a[i];
}
}
printf("%d\n",output);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息