#pragma warning(disable:4786) 
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <fstream>
#include <numeric>
#include <utility>

using namespace std;

class myPair
{
public:

	float getfirst(){return first;}
	float getsecond(){return second;}
	void setsecond(float a){second=a;}
	void setfirst(float b){first=b;}
    friend ostream& operator<< (ostream& os,const myPair& mp)
	{
	    os <<"("<<mp.first <<","<<mp.second<<")";
	    return os;
	}
    friend istream& operator>> (istream& is,myPair& mp)
	{
	    is>>mp.first;
	    is>>mp.second;
	    return is;
	}
private:
    float first,second;
};
typedef vector<myPair> VECTOR_MYPAIR;

struct MYSUM
{
	float sum_first;
	float sum_second;
	float sum_first_square;
	float sum_product;
};

class computeab
{

public:
	computeab(MYSUM a){
		a.sum_first=0;
		a.sum_second=0;
		a.sum_first_square=0;
		a.sum_product=0;
	};
    MYSUM operator()(MYSUM& a,myPair& mp)
	{
		a.sum_first+=mp.getfirst();
		a.sum_second+=mp.getsecond();
        a.sum_first_square+=mp.getfirst()*mp.getfirst();
		a.sum_product+=mp.getfirst()*mp.getsecond();
		return a;   
	}
private:
    MYSUM a;
};

myPair compute_ab(VECTOR_MYPAIR& mp)
{
	myPair ab;
    MYSUM a;
	a.sum_first=0;a.sum_first_square=0;a.sum_product=0;a.sum_second=0;
    MYSUM b=accumulate(mp.begin(),mp.end(),a,computeab(a));   
    //cout <<"sum:"<<b.sum_first<<" "<<b.sum_first_square<<" "<<b.sum_product;
	//cout <<" "<<b.sum_second<<" "<<mp.size()<<endl;
	float val=(b.sum_first*b.sum_second - mp.size()*b.sum_product)/
		(b.sum_first*b.sum_first-mp.size()*b.sum_first_square);
	ab.setsecond(val);
	ab.setfirst(float((b.sum_second - ab.getsecond()*b.sum_first)/(mp.size())));
	return ab;
}
int main()
{ 
        cout<<"please input some pairs of numbers:\n";         
	istream_iterator <myPair> ii(cin);
	istream_iterator<myPair> eos;
	VECTOR_MYPAIR	b;
	copy(ii,eos,back_inserter(b));
	cout<<"There are "<<b.size()<<" pairs of numbers,and they are respectively:\n";
	ostream_iterator<myPair> oo(cout,"\n");
	copy(b.begin(),b.end(),oo);
	cout<< "the result of (a,b) is : "<<compute_ab(b)<<endl;
	return 0;
} 

