题目传送门
ps:一般这种给一个数列求第n项,n还特别大的。要么矩阵快速幂,要么转化递推式。不过这题数据也特别多有100000组,所以就算矩阵快速幂可能也要超时,而且我还没推出来。转化递推式需要比较强的数学基础,我也转化不了。ε=(´ο`*)))唉,只能打表找规律。
- 打表代码
#include "bits/stdc++.h" using namespace std; const int MAXN = 110; int a[MAXN]; int main() { a[1] = 1; int sum = 0; for (int i = 2; i <= 100; i++) { sum += a[i - 1] * (i - 1); a[i] = sum % i; } for (int i = 1; i <= 100; i++) printf("%d %d\n", i, a[i]); return 0; }
sol:由上面代码打表后发现a[i] = i - 1或者a[i] * 2 = i的情况经常出现,罗列a[i] = i - 1的情况发现都满足i % 6 = 4,而a[i] * 2 = i 的情况下都满足i % 6 = 0 或 i % 6 = 2。其实这时候已经能猜到数列6个一组有规律,接下去应该把所有i % 6 = 1, i % 6 = 3, i % 6 = 5的情况分别罗列一下就能发现剩下的规律,而我当时却把这三种情况放一起看了。 i % 2 == 1。导致规律不易观察又花费了不少时间。
- 规律
#include "bits/stdc++.h" using namespace std; typedef long long LL; int main() { LL t, n; scanf("%lld", &t); while (t--) { scanf("%lld", &n); switch(n % 6) { case 0 : printf("%lld\n", n / 2); break; case 1 : printf("%lld\n", n / 6 * 4 + 1); break; case 2 : printf("%lld\n", n / 2); break; case 3 : printf("%lld\n", n / 6); break; case 4 : printf("%lld\n", n - 1); break; case 5 : printf("%lld\n", n / 6); break; } } return 0; }
有一段时间没写博客了,也没有好好刷题了。乘着百度之星开始继续努力吧。