A. Perfect Permutation 这道为水题,没什么好说的。。。if(i%2) a[i]=i+1; else a[i]=i-1;
B. Non-square Equation为避免超时,枚举s(x)从1到81,而不是枚举x,然后用n和s(x)及求根公式求出x,判断x是否满足条件。。。找出最小的x。。。。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define inf 0x7fffffff
#define ll long long
ll n,x,min;
int sumdig(ll m)
{
int sum=0;
while(m)
{
sum+=m%10;
m/=10;
}
return sum;
}
int main()
{
int n,i,j,flag;
double c,t;
while(scanf("%I64d",&n)!=EOF){
flag=0;
min=inf;
for(i=1;i<=81;i++){
c=i*i*1.0;
t=sqrt(c+4*n);
x=(ll)((t-i)/2);
if(x>0 && x*x+x*i==n && sumdig(x)==i){
flag=1;
if(x<min) min=x;
}
}
if(flag)
printf("%I64d\n",min);
else printf("-1\n");
}
return 0;
}
C. Cycles利用组合数确定最小的完全图,然后逐个添加点,每加1个点,可和其余点中任意两个构成一个三元环,找C(m,2)<=k的最大值。。。直到达到k个三元环。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define inf 0x7fffffff
int a[110][110];
int count(int m,int n)
{
if(m==0||n==0) return 1;
return count(m-1,n-1)*m/n;
}
int main()
{
int k,n,m,i,j;
while(scanf("%d",&k)!=EOF){
memset(a,0,sizeof(a));
for(i=3;i<=100;i++){
m=count(i,3);
if(m>=k) break;
}
n=i;
if(m==k){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(i!=j) a[i][j]=1;
}
}
else{
n--;
k-=count(n,3);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
if(i==j) a[i][j]=0;
else a[i][j]=1;
}
while(k){
for(i=3;k>=count(i,2);i++) ;
k-=count(i-1,2); n++;
for(j=1;j<=i-1;j++)
a[n][j]=a[j][n]=1;
}
}
printf("%d\n",n);
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%d",a[i][j]);
}
printf("\n");
}
}
return 0;
}