Seq

2019 年百度之星·程序设计大赛 - 初赛一2019-08-17 18:00:00 

Seq (找规律)

Problem Description

度度熊有一个递推式           其中a​1​​=1。现给出 n,需要求 an。

Input

第一行输入一个整数 T,代表 T (1≤T≤100000组数据。 接下 T 行,每行一个数字 n (1≤n≤10^12)。

Output

输出 T 行,每行一个整数表示答案。

Sample Input

5
1
2
3
4
5
Sample Output

1
1
0
3
0

 题意:给出n,求( a[1] * 1 + a[2] * 2 + …… + a[n-1]*(n-1) ) % n;

思路:我是写出25个数据,(写到15就发现了,只是a7->a13->到下一个,,这个规律不明显,然后就又多写了几个)然后找规律的,直觉告诉我,存在简单的规律,是我目前能力能找出来的规律题,但是这种题算法是解决的最好办法,比赛结束后,我看了榜单前几位大佬的代码。果然写这种题不需要打表数据找规律,直接敲公式代码就过了~

a1=1;    

 (0)                 (1)                   (2)                    (3)                

a2=1;              a8=4;                a14=7;              a20=10;------------------>下标的一半

a3=0;              a9=1;                a15=2;              a21=3;  ------------------->第几组+1;(每六个数一组)

a4=3;              a10=9;               a16=15;           a22=21;------------------->下标减一

a5=0;              a11=1;               a17=2;              a23=3;------------------->和第二行相等

a6=3;              a12=6;               a18=9;              a24=12;------------------->下标的一半

a7=5;              a13=9;               a19=13;            a25=17;------------------->第几组*4+5;

Code:第一:

我的代码:

#include<stdio.h>
#include<string.h>
typedef long long ll;
const int N=1e5+10;
#include<algorithm>
using namespace std;
ll xx(ll n,ll w,ll m)
{
    if(w==0)return n/2;
    if(w==1)return m;
    if(w==2)return n-1;
    if(w==3)return m;
    if(w==4)return n/2;
    if(w==5)return 4*m+1;
}
int main()
{
    ll t,n;
    scanf("%lld",&t);
    while(t--)
    {
        scanf("%lld",&n);
        if(n==1)
        {
            printf("1\n");
            continue;
        }
        ll m=(n-1)/6;
        ll w=(n-2)%6;///这里我改动了好多次...哎,知道规律了,代码实现对我来说也不容易啊,我的思维就是渣渣木....基础太薄弱~           认识到了就知道下一步该怎么做了~~
        printf("%lld\n",xx(n,w,m));
    }
    return 0;
}

某位大佬代码~(百度之星前10的代码,具体也不晓得是哪位了~如果大佬看见了,希望不要怪罪小弟~小弟也只是想多学习学习您...)

我还能说什么........a....好简洁~

const int b[6] = {0, 1, 1, 0, 3, 0};
const int d[6] = {3, 4, 3, 1, 6, 1};

第一个数是n/6;

第二个数是1+(n/6)* 4;

第三个数是1+(n/6)* 3;

第四个数是(n/6);

第五个数是3+(n/6)*6;

第六个数是n/6。

只要求出对6取余是哪一个数,输出相应的公式即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll T, n;
const int b[6] = {0, 1, 1, 0, 3, 0};
const int d[6] = {3, 4, 3, 1, 6, 1};
int main()
{
    for(cin>>T; T; T--)
    {
        scanf("%I64d",&n);
        printf("%I64d\n",b[n%6]+(n/6)*d[n%6]);
    }
}

还有一位,也是哈,我就是借鉴学习一下大佬的思想~

#include<cstdio>
long long a[1000000],b[1000000];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        long long n,s;
        scanf("%I64d",&n);
        if(n%6==0||n%6==2)s=n/2;
        else if(n%6==1)s=n*2/3+1;
        else if(n%6==4)s=n-1;
        else s=n/6;
        printf("%I64d\n",s);
    }
}

附图:

↖(^ω^)↗

戒骄戒躁~

你有没有发现在你的身边,有些人总是积极、乐观、充满好奇,善于发现生活的美好,

于是他们过的喜悦、感恩,充满创造力。

嘿嘿~~~~~\(≧▽≦)/~啦啦啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵩韵儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值