描述
题解
数论题,直接调用结论……要是想知道怎么证明,建议去看看那本叫做《初等数论及其应用》第七章部分讲有详细的推论与证明。
至于结论嘛,在题解中说的十分清楚了,贴出来大家看看吧……最讨厌这种题了……对我这样的数学渣滓来说,要命的。
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;
}