太菜了,只做对了第一题,然而第一题还做了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;
}