您的位置:首页 > 其它

2016计蒜之道-初赛-第四场-B-遗失的支付宝密码

2016-06-11 17:11 295 查看

描述

某用户忘记了支付宝的登录密码,他只记得自己的密码满足以下几个条件:

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

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

密码的任意一个前缀都 不是 一个 square。>>>详情请点击

题解

一道找规律的问题,逐位考虑情况。如第二组测试数据:4,5。

一共四位,先来考虑一位的,有5种情况;再来考虑两位的,因为需要避免square的出现,所以需要第二位和第一位不同,那么就有5 x 5 - 5 = 20种情况;接着考虑三位,第三位因为是基于前两位来填数字,所以无论填几都是满足的,所以是20 x 5 = 100种情况;四位的情况是再在三位的情况下填一位,因为要避免第三和第四位的组合和前两位的组合相同,所以是需要减去前两位存在的组合情况,也就是说是100 x 5 - 20 = 480种情况。加在一起也就是605种情况,大概就是这个样子。

大数据范围的情况暂时没有什么好的思路解决,2^32次方是0xffffffff+1,怎么取模是个问题,需要思考思考。

代码C++

#include <iostream>

typedef long long LL;
LL MOD = 4294967296;
LL n, m;
LL A[101];

int main(int argc, const char * argv[])
{
while (std::cin >> n >> m)
{
A[0] = 1;
for (int i = 1; i <= n; i++)
{
if (i % 2)
{
A[i] = A[i - 1] * m;
}
else
{
A[i] = A[i - 1] * m - A[i / 2];
}
}
LL ans = 0;
for (int i = 1; i <= n; i++)
{
ans = (ans + A[i]) % MOD;
}
std::cout << ans << std::endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  迭代