P7976 「Stoi2033」园游会
首先根据题意,这个题可以直接对每个数字取模后的杨辉三角进行前
首先,根据经验(事实上推导一下也很简单),在常规杨辉三角中,第
经过打表观察(下面有个小表),这个杨辉三角每一行的和也是
但是我们再仔细观察一下,我们发现可以把每
1 2 1
2 4 2
1 2 1
2 4 2
4 8 4
2 4 2
1 2 1
2 4 2
1 2 1
(表
再小瞄一眼,就会发现,事实上,行与行之间也有相似的结论,即我们可以把第一行
1
2
1
2
4
2
1
2
1
(表
再对他进行一定的变形
1 2 1
2 4 2
1 2 1
(表
我们可以惊奇地发现,这和之前原始那个表
知道了规律就开始尝试实现一下,既然是
由于我们要求的是前
首先,把
下面可以形象化的理解一下:
所以我们可以先预处理出每一行每个数字对应的基础权值(如,第一层的权值必然是
我们再以
然后第
所以我们直接先分解
上代码!(超短诶,简单易懂,建议配合样例数据食用)
#include<bits/stdc++.h>
using namespace std;
typedef long long lol;
typedef pair<int, int> pii;
typedef pair<int, lol> pil;
typedef pair<double, double> pdd;
typedef unsigned int uin;
const int mod = 1732073999, N = 305;
int t, f[3] = {1, 2, 1}, p[3] = {0, 1, 3}, l[N], idx;
lol maxn, n, ex[N];
int main () {
scanf ("%d%lld", &t, &maxn);
ex[1] = 1;
for (int i = 2; i < N; ++ i )
ex[i] = ex[i - 1] * 4 % mod;
while (t -- )
{
scanf ("%lld", &n);
lol ans = 0, x = 1;
++ n, idx = 0;
while (n)
l[++ idx] = n % 3, n /= 3;
for (int i = idx; i >= 1; -- i )
ans = (ans + p[l[i]] * x * ex[i]) % mod, x = x * f[l[i]] % mod;
printf ("%lld\n", ans);
}
return 0;
}