20200911 day6 刷题记录

1 1052 全排列

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[25];
bool vis[25];
int n;
int ans=0; 
void f(int x){
	if(x==n+1){
		ans++;
		//if(ans<=3){
			for(int i=1;i<=n;i++){
				printf("%5d",a[i]);
			}
			printf("\n");
		//}
		return;
	}
	for(int i=1;i<=n;i++)
	{
		if(vis[i]==1) continue;
		bool q=1;
		//for(int j=1;j<x;j++)
		//{
		//	if(abs(x-j)==abs(i-a[j])){
		//		q=0;
		//		break;
		//	}
		//	
		//}
		if(q){
			vis[i]=1;
			a[x]=i;
			f(x+1);
			vis[i]=0;
		}
		
	}
	return ;
}
int main( ){
	scanf("%d",&n);
	f(1);
	//printf("%d",ans); //...
	return 0;
} 

2 1046

题意

\(m,n∈[1,k]∩Z\)
\((n^2-mn-m^2)^2=1\)

你的任务是:输入正整数\(k(1≤k≤109)\),求一组满足上述两个条件的\(m,n\),并且使\(m^2+n^2\)的值最大。例如,从键盘输入\(k=1995\),则输出:\(m=987,n=1597\)

题解

根据

\[(n^2-mn-m^2)^2=1 \]

\[(m^2+nm-n^2)^2=1 \]

又因为

\[m^2+nm-n^2=(m+n)^2-mn-2n^2 \]

\[=(m+n)^2-(m+n)n-n^2 \]

所以

\[(n^2-mn-m^2)^2=((m+n)^2-(m+n)n-n^2)^2 \]

所以看出来如果\(m\)\(n\)是一组解那么\(m+n\)\(n\)也是一组合法解
枚举第一组可以知道这\(m\)\(n\)就是\(FIB\)的相邻两项
所以题目变成了了求小于\(k\)的最大的\(FIB\)相邻两项

未AC原因

#include<cstdio>
long long a,b,c,k;
int main(){
	scanf("%lld",&k);
	a=1,b=1,c=a+b;
	while (c<k)
	{
		a=b;
		b=c;
		c=a+b;

	}
	printf("m=%lld\nn=%lld\n",a,b);
	return 0;
} 

题外话

\(m,n\in [1,k]\)

\(n^2-m^2=1+mn\)

\((m^2+n^2)^2=5m^2n^2+2mn+1=5x^2+2x+1=5(x+\dfrac{1}{5})^2+\dfrac{4}{5}\)

\(n^2-mn-m^2=-1\)

\((m^2+n^2)^2=3m^2n^2+1=3x^2+1\)

posted @ 2020-09-11 13:39  刘子闻  阅读(85)  评论(0编辑  收藏  举报