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

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

转载于:https://www.cnblogs.com/Angel-Demon/p/11371828.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值