MnZn求挑错
查看原帖
MnZn求挑错
857626
_RainCappuccino_楼主2023/7/22 11:27

给定 a,ba,b 求出 f(x)=ax+bf(x) = \sqrt{ax} + b 所有的不动点。


我的思路:

  • 先移项:x−b=axx-b=\sqrt{ax}
  • 再平方:(x−b)2=ax(x - b)^2 = ax
  • 化简:x2−(2b+a)x+b2=0x^2 - (2b + a)x + b^2 = 0
  • 最后求解二元一次方程
#include<bits/stdc++.h>
using namespace std;

#define M 200010
#define int long long

#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define fr(i,j,k) for(int i=j;i<=k;++i)
#define rs(i,j,k) for(int i=j;i>=k;--i)
#define endl '\n'
#define IOS ios::sync_with_stdio(0)
#define pb(i) push_back(i)
#define pf(i) push_front(i)
#define mem(a,b) memset(a,b,sizeof a)

int find_gen(int a, int b, int c) {
	if (b * b - 4 * a * c == 0)  return 1;
	else if (b * b - 4 * a * c > 0) return 2;
	else  return 0;
}

signed main() {
	IOS;
	int t;
	cin >> t;
	while (t --) {
		int A, B;
		cin >> A >> B;
		int a = 1, b = -(2 * B + A), c = B * B;
		int det = (b * b) - (4 * a * c);
		int ans = 0;
		double x1 = (-b + sqrt(det)) / (2 * a);
		double x2 = (-b - sqrt(det)) / (2 * a);
		if(x1 > x2) swap(x1,x2);
		if(x1 > b) ans ++;
		if(x2 > b && x2 != x1) ans ++;
		cout << ans << endl;
		if(x1 > b){
			cout << x1 << ' ';
		}
		if(x2 > b && x1 != x2){
			cout << x2 << endl;
		}
	}
	return 0;
}
2023/7/22 11:27
加载中...