给你 a,b,c,使得 (a+b+2044) x d=(c x e) mod 2058$。
输出其中一种方案即可。
如果没有,输出 -1。
本题包含多组数据。
给定一个 T,表示数据的组数。
接着 T 行,输入三个整数 a,b,c。
T 行,每行包含两个整数 d 和 e,以一个空格隔开。
d 和 e 均不能为 0,1 或负数。
1≤T≤100,1≤a,b,c≤10^18
给你 a,b,c,使得 (a+b+2044) x d=(c x e) mod 2058$。
输出其中一种方案即可。
如果没有,输出 -1。
本题包含多组数据。
给定一个 T,表示数据的组数。
接着 T 行,输入三个整数 a,b,c。
T 行,每行包含两个整数 d 和 e,以一个空格隔开。
d 和 e 均不能为 0,1 或负数。
1≤T≤100,1≤a,b,c≤10^18
先用高精度求出a+b+2044的值,在穷举d和e
高精度乘法:
struct bignum{
int d[200];
bignum operator*(int x){ //注意这里传入的x的范围不是int的范围,而是[0,(2^31-1)/9]。
bignum tmp;
for (int i=0;i<200;i++) tmp.d[i]=d[i]*x;
for (int i=0;i<199;i++){
tmp.d[i+1]+=tmp.d[i]/10; //从低位至高位处理进位
tmp.d[i]%=10;
}
return tmp;
}
bignum operator*(bignum x){ //注意可以重载两次运算符*,但是*右侧的类型得不相同。
bignum tmp;
for (int i=0;i<200;i++) tmp.d[i]=0;
for (int i=0;i<200;i++)
for (int j=0;j+i<200;j++){ //注意i+j要在数组范围内
tmp.d[i+j]+=d[i]*x.d[j];
}
for (int i=0;i<199;i++){
tmp.d[i+1]+=tmp.d[i]/10; //从低位至高位处理进位
tmp.d[i]%=10;
}
return tmp;
}
};
高精度加法:
#include<bits/stdc++.h>
using namespace std;
struct bignum{
int d[200];
void read(){
char s[205];
scanf("%s",s);
int n=strlen(s);
for (int i=0;i<n;i++) d[i]=s[n-1-i]-'0'; //读入的数和bignum的存储方式是相反的
for (int i=n;i<200;i++) d[i]=0; //更高位要赋为0
}
void print(){
int pos=199;
while (pos>0&&!d[pos]) pos--; //找到最高位位置
for (int i=pos;i>=0;i--) printf("%d",d[i]); puts("");
}
bignum operator+(bignum x){
bignum tmp;
for (int i=0;i<200;i++) tmp.d[i]=d[i]+x.d[i];
for (int i=0;i<199;i++){
if (tmp.d[i]>=10){ //发生进位
tmp.d[i]-=10;
tmp.d[i+1]++;
}
}
return tmp;
}
}A,B,C;
int main(){
A.read();
B.read();
C=A+B;
C.print();
}
高精度除法:
struct bignum{
int d[200];
void init(){ //清0
for (int i=0;i<200;i++) d[i]=0;
}
// 需要重载‘-’和‘<’的运算符
bignum operator/(bignum x){
bignum tmp,a,b;
tmp.init();
for (int i=0;i<200;i++) a.d[i]=d[i];
for (int i=99;i>=0;i--){ //这里默认除数x和答案都不超过100位
// 循环里模拟做商的过程,用减法代替除法。
b.init();
for (int j=0;j<100;j++) b.d[j+i]=x.d[j];
while (!(a<b)) a=a-b,tmp.d[i]++;
}
return tmp;
}
};