2019百度之星初赛1

太菜了,只做对了第一题,然而第一题还做了40分钟,大佬只需2分钟
我原来把数据的顺序看反了,他是先输入个位再十位,我先十位再个位了

A Polynomial

水题,学过高数就会,就是取极限
传送门

反着存数据,然后计算最高位开始0的个数

如果0的个数相同,就输出最高非0数的约分比(除以gcd)
len1和len2
len1大,即分子的前几位0多
输出0/1
len2大,输出
1/0

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int b[maxn];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=n-1;i>=0;i--){
            scanf("%d",&a[i]);
        }
        for(int i=n-1;i>=0;i--){
            scanf("%d",&b[i]);
        }
        int len1=0,len2=0;
        for(int i=0;i<n;i++){
            if(a[i]!=0){
               len1=i;
               break;
            }
        }
        for(int i=0;i<n;i++){
            if(b[i]!=0){
               len2=i;
               break;
            }
        }
        if(len1==len2){
            int g=__gcd(a[len1],b[len2]);
            printf("%d/%d\n",a[len1]/g,b[len2]/g);
        }else if(len1>len2){
            printf("0/1\n");
        }else{
            printf("1/0\n");
        }

    }
    return 0;
}

E Seq

传送门
我找规律时用得是5的倍数或者10的倍数,没想到是6的倍数,所以规律题要把1-10的倍数都尝试一下
看数据大小就知道不能暴力,那肯定是规律题,先把前几项输出找规律

枚举求前几项

#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[10005];
    a[1]=1;
    for(int i=2;i<=n;i++){
        a[i]=0;
        for(int j=1;j<i;j++){
            a[i]+=a[j]*j;
        }
        a[i]%=i;
    }
    for(int i=1;i<=n;i++){
        printf("%3d",a[i]);
        if(i%6==0)putchar('\n');
    }

    return 0;
}

输出

60
  1  1  0  3  0  3
  5  4  1  9  1  6
  9  7  2 15  2  9
 13 10  3 21  3 12
 17 13  4 27  4 15
 21 16  5 33  5 18
 25 19  6 39  6 21
 29 22  7 45  7 24
 33 25  8 51  8 27
 37 28  9 57  9 30

发现n

如果是6的倍数,就输出n/2
如果是6的倍数-1,就输出n/6
如果是6的倍数-2,就输出n/3*3
如果是6的倍数-3,就输出n/6
如果是6的倍数-4,就输出n/6*3+1
如果是6的倍数-5,就输出n/6*4+1

提交代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        ll n;
        scanf("%lld",&n);
        switch(n%6){
            case 1:printf("%lld\n",n/6*4+1);break;
            case 2:printf("%lld\n",n/6*3+1);break;
            case 3:printf("%lld\n",n/6);break;
            case 4:printf("%lld\n",n/3*3);break;
            case 5:printf("%lld\n",n/6);break;
            case 0:printf("%lld\n",n/2);break;
        }
    }

    return 0;
}

转载于:https://www.cnblogs.com/Emcikem/p/11371807.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值