51Nod-1969-Fire!

来源:互联网 发布:linux shell 打开目录 编辑:程序博客网 时间:2024/06/06 14:09

ACM模版

描述

描述

题解

数论题,直接调用结论……要是想知道怎么证明,建议去看看那本叫做《初等数论及其应用》第七章部分讲有详细的推论与证明。

至于结论嘛,在题解中说的十分清楚了,贴出来大家看看吧……最讨厌这种题了……对我这样的数学渣滓来说,要命的。

描述

P.s. 这尼玛都是神马玩意儿啊……

代码

#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int MOD = 1e9 + 7;const int MAGIC = 998244352;const int MAXN = 1e5 + 10;int T, base;long long pow_base[MAXN];template <class T>inline void scan_d(T &ret){    char c;    ret = 0;    while ((c = getchar()) < '0' || c > '9');    while (c >= '0' && c <= '9')    {        ret = ret * 10 + (c - '0'), c = getchar();    }}void init(){    pow_base[0] = 1;    pow_base[1] = base;    for (int i = 2; i < T; i++)    {        pow_base[i] = base * pow_base[i - 1];        pow_base[i] %= MOD;    }}int main(int argc, const char * argv[]){    cin >> T >> base;    init();    long long N, ans = 0;    while (T--)    {        scan_d(N);        double tmp = sqrt(1 + 24 * N);        int k1 = (tmp + 1) / 6;        int k2 = (tmp - 1) / 6;        if (k1 * (3 * k1 - 1) == 2 * N)        {            if (k1 & 1)            {                ans += (MAGIC * pow_base[T]) % MOD;            }            else            {                ans += pow_base[T];            }            ans %= MOD;        }        else if (k2 * (3 * k2 + 1) == 2 * N)        {            if (k2 & 1)            {                ans += (MAGIC * pow_base[T]) % MOD;            }            else            {                ans += pow_base[T];            }            ans %= MOD;        }    }    printf("%lld\n", ans);    return 0;}
原创粉丝点击