#include <iostream>
using namespace std;
class FiniteField
{
int mPrime, mD;
public:
FiniteField(int ip = 0, int id = 0)
:mPrime(ip), mD(id)
{
}
void Show()
{
cout << mD<< endl;
}
friend istream& operator>>(istream&, const FiniteField&);
friend ostream& operator<<(ostream&, const FiniteField&);
FiniteField operator +(const FiniteField& ff)
{
return FiniteField(mPrime, (mD + ff.mD) % mPrime);
}
FiniteField operator *(const FiniteField& ff)
{
return FiniteField(mPrime, (mD * ff.mD) % mPrime);
}
FiniteField operator -(const FiniteField& ff)
{
return FiniteField(mPrime, (mD + (mPrime - ff.mD)) % mPrime);
}
FiniteField operator /(const FiniteField& ff)
{
int k = 1;
for (; k < mPrime; ++k){
if ((k*ff.mD) % mPrime == 1)
break;
}
return FiniteField(mPrime, (mD * k) % mPrime);
}
};
istream& operator>>(istream& in, const FiniteField& ff)
{
return cin >> ff.mD;
}
ostream& operator<<(ostream& on, const FiniteField& ff)
{
return cout << ff.mD;
}
class myCurve
{
FiniteField a, b, c;
public:
myCurve(FiniteField a, FiniteField b, FiniteField c)
{
this->a = a; this->b = b; this->c = c;
}
FiniteField operator()(FiniteField x)
{
return a*x*x + b*x + c;
}
};
// StudybarCommentBegin
#include<sstream>
int main()
{
int prime, a, b, c, x = 1;
string password;
cin >> prime; //input a prime num
cin >> password;
stringstream ss; //字符流对象
ss << password.substr(0, 2) << " " << password.substr(2, 2) << " " << password.substr(4, 2);
//上一句的substr取子串从标0开始,取子串长度为2; 输入字符串流
ss >> a >> b >> c; //字符流 流入整数a,b,c中
FiniteField fa(prime, a), fb(prime, b), fc(prime, c), fx1(prime, x), fx2(prime, x + 1), fx3(prime, x + 2), fx4(prime, x + 3);
myCurve mycurve(fa, fb, fc); //对象 初始化
cout << mycurve(fx1) << endl; //因为重载了(), 所以这里类似函数一样被调用了
cout << mycurve(fx2) << endl;
cout << mycurve(fx3) << endl;
cout << mycurve(fx4) << endl;
return 0;
}
//StudybarCommentEndnd