2019 年百度之星·程序设计大赛 - 初赛一2019-08-17 18:00:00
Seq (找规律)
Problem Description
度度熊有一个递推式
其中a1=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 Output1
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);
}
}
附图:
↖(^ω^)↗
戒骄戒躁~
你有没有发现在你的身边,有些人总是积极、乐观、充满好奇,善于发现生活的美好,
于是他们过的喜悦、感恩,充满创造力。
嘿嘿~~~~~\(≧▽≦)/~啦啦啦