A. Infinite Sequence
题意:已知一个等差数列的第一项a和公差c,问b是不属于这个等差数列。
分析:求d=b-a,再根据d和c的符号来判断。如果d和c同号,且d能整除c,那么b是。如果d==0,那么说明a==b,肯定是可以的,也可能的c==0,那么这个数列是常数数列,肯定是不可以的。如果d和c异号,那么根据第一项的增加或者减少都是不肯到b 的,肯定不能啦。
代码:
1 /*A*/ 2 #include<cstdio> 3 using namespace std; 4 5 int main() 6 { 7 long long a,b,c; 8 while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF) 9 { 10 long long d=b-a; 11 if(d*c>0) 12 { 13 if(d%c==0) 14 printf("YES "); 15 else 16 printf("No "); 17 } 18 else if(d*c==0) 19 { 20 if(d==0) 21 printf("YES "); 22 else 23 printf("NO "); 24 } 25 else 26 printf("NO "); 27 } 28 return 0; 29 }
B. Restoring Painting
题意:有一个3*3的方格,里面已经填好了a,b,c,d,现在需要用1~n是数字来填满这个方阵,使得任意一个2*2的方阵里数字的和等于左上角2*2方格里的数字之和。问有多少种满足条件的填法。
分析:题目的意思就是要左上角A,右上角B,左下角C,右下角D四个2*2的方格中的数字分别加起来要相等。给出a,b,c,d后,A=a+b,B=a+c,C=b+d,D=c+d。我们先填中间的数字,这个数字属于四个方格,所以最后每个方格都要加上这个数字,所以A,B,C,D的差值是不变的,而最后填的四个角,就需要来抵消这个差值,使得四个方格相等。所以最后的答案就是中间格子可以填的种数乘四个角可以填的种数。中间n个数字都可以填,因为是不会影响差值的。四个角可以填的个数则要看差值是多少,可以填的种数=n-差值。如果差值为0,那么每个数都可以填,如果差值为1,那么最大的那个数是不可以填到数字最大的那个格子里的,因为其他格子就无法满足了。
注意:当n-差值<=0时,方法数为0,而且要用long long 。
代码:
1 /*B*/ 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 long long Max(long long a,long long b,long long c,long long d) 7 { 8 long long t; 9 t=max(a,b); 10 t=max(t,c); 11 t=max(t,d); 12 return t; 13 } 14 long long Min(long long a,long long b,long long c,long long d) 15 { 16 long long t; 17 t=min(a,b); 18 t=min(t,c); 19 t=min(t,d); 20 return t; 21 } 22 23 24 int main() 25 { 26 long long n; 27 long long a,b,c,d; 28 while(scanf("%I64d%I64d%I64d%I64d%I64d",&n,&a,&b,&c,&d)!=EOF) 29 { 30 long long A,B,C,D; 31 A=a+b;B=a+c; 32 C=b+d;D=c+d; 33 long long mmax=Max(A,B,C,D); 34 long long mmin=Min(A,B,C,D); 35 long long d=mmax-mmin; 36 long long ans; 37 if((n-d)<0) 38 ans=0; 39 else 40 ans=(n-d)*n; 41 printf("%I64d ",ans); 42 } 43 return 0; 44 }