描述

某用户忘记了支付宝的登录密码,他只记得自己的密码满足以下几个条件:
密码中最多有 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;
}