#include<stdio.h>
#include<math.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int x1,y1,r1,x2,y2,r2;
scanf("%d%d%d%d%d%d",&x1,&y1,&r1,&x2,&y2,&r2);
int dist=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
int len1=abs(r1-r2);
int len2=r1+r2;
if(dist<len1*len1) puts("1");
else if(dist==len1*len1) puts("2");
else if(dist>len1*len1&&dist<len2*len2) puts("3");
else if(dist==len2*len2) puts("4");
else puts("5");
}
return 0;
}
#include<stdio.h>
#include<math.h>
long long gcd(long long a,long long b)
{
return b>0?gcd(b,a%b):a;
}
long long a[15],b[15];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
for(int i=1;i<=n;i++) scanf("%I64d",&b[i]);
if(n==1)
{
long long temp=gcd(a[1],b[1]);
a[1]/=temp;
b[1]/=temp;
if(a[1]==1) printf("%I64d\n",b[1]);
else printf("%I64d/%I64d\n",b[1],a[1]);
}
else
{
long long up=b[n],down=a[n];
for(int i=n;i>=2;i--)
{
long long temp=gcd(up,down);
up/=temp;
down/=temp;
long long temp1=down,temp2=up;
up=b[i-1]*temp1;
down=a[i-1]*temp1+temp2;
}
long long temp=gcd(up,down);
up/=temp;
down/=temp;
if(down==1) printf("%I64d\n",up);
else printf("%I64d/%I64d\n",up,down);
}
}
return 0;
}
一直在想如果我除的时候出现了小数,但是我又只可以整除,我该怎么处理,如果用double的话,只可以保留一定的精度,不够准确,所以这里需要推导一下公式是什么样子,很简单,代入一个特殊情况就可以推导出来,比如说,
不需要计算出结果,化简表达式即可,然后OJ 要用%I64d 提交,注意代换的时候变量会发生变化,所以要用临时变量来保存,最大公约数的函数需要记住
#include<stdio.h>
#define N 100
int a[N],b[N],c[N];
void start()
{
a[1]=b[1]=c[1]=1;
a[2]=b[2]=c[2]=1;
for(int i=3;i<=N;i++)
{
a[i]=a[i-1]+a[i-2];
b[i]=b[i-1]+b[i-2];
c[i]=c[i-1]+c[i-2];
}
}
int main()
{
start();
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int cnt=0;
//bool flag=false;
for(int i=1;i<=45;i++)
{
for(int j=i;j<=45;j++)
{
for(int k=j;k<=45;k++)
{
if(a[i]+b[j]+c[k]==n)
{
if(i==2) break;
if(j==2) break;
if(k==2) break;
cnt++;
//printf("%d=%d+%d+%d\n",n,a[i],b[j],c[k]);
//continue;
//flag=true;
//主要是因为数组里面有两个数字是一样的
break;
}
}
//flag=false;
}
}
printf("%d\n",cnt);
}
return 0;
}
#include<stdio.h>
int a[10000000];
int main()
{
a[1]=1;
a[2]=1;
for(int i=3;i<=1000000000;i++)
{
a[i]=a[i-1]+a[i-2];
if(a[i]>1000000000)
{
//printf("%d\n",i);
break;
}
}
// printf("%d\n",a[45]);
for(int i=1;i<=45;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
首先预处理出来所有的斐波那契数列,经过计算发现第45个数字就超过了1000000000,数据范围比较小,可以直接三重循环求解,交换顺序算作同一个情况,所以让数字从小到大不严格单调递增排列即可,但是可以发现有一些问题,主要是因为,斐波那契数列第一个数字和第二个数字相等,所以特殊处理一下前面两个数字,通俗的说,只要使用到了第二个斐波那契数列,就直接跳过
其实我以为数字会比较大,三层循环会超时,但是其实数字只有45,所以完全不用担心