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);
}
}
}
密码中最多有 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);
}
}
}
相关文章推荐
- 2016计蒜之道初赛第四场---------淘宝流量分配【水题】
- windows下安装xgboost的python包
- R学习常用
- IOS7笔记-10、多线程、滚动视图
- AJAX简单使用介绍
- android onTouch()与onTouchEvent()的区别
- dpdk参考文章
- 2016计蒜之道-初赛-第四场-B-遗失的支付宝密码
- 线索二叉树 --->树
- Mysql触发器
- 浮点数为什么不精确?
- libuv学习笔记(3)
- task_struct结构体字段介绍--Linux中的PCB
- HTTPS与SSL(二)
- 字符串编码ASCII、Unicode和UTF-8
- 第十六周项目 阅读程序(9)
- HTTPS与SSL(二)
- bui上手体验
- 观察者模式