HDU-6672-Seq

题目传送门

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;
    }

    有一段时间没写博客了,也没有好好刷题了。乘着百度之星开始继续努力吧。

posted @ 2019-08-18 11:34  Jathon-cnblogs  阅读(213)  评论(0编辑  收藏  举报