高精度乘
作者:
quiet_
,
2023-05-05 23:06:27
,
所有人可见
,
阅读 177
#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
int cnt[N];
struct games
{
vector<int> s;
vector<int> p;
};
struct players
{
int x;
int y;
vector<int> z;
};
games ga[N];
players pla[N];
vector<int> bigmul(vector<int> &A, int d)
{
vector<int> C;
int t = 0;
for(int i = 0 ; i < A.size() || t ; i ++)
{
if(i < A.size()) t = t + A[i]*d;
C.push_back(t % 10);
t = t / 10;
}
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
vector<int> bigminus(vector<int> &A, vector<int> &B)
{
vector<int> C;
int t = 0;
for(int i = 0 ; i < A.size() ; i ++)
{
t = t + A[i];
if(i < B.size()) t = t - B[i];
C.push_back((t + 10) % 10);
if(t < 0) t = -1;
else t = 0;
}
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
bool cmp1(vector<int> &A,vector<int> &B)
{
if(A.size() > B.size()) return true;
if(A.size() < B.size()) return false;
for(int i = A.size() - 1 ; i >= 0; i --)
{
if(A[i] > B[i]) return true;
if(A[i] < B[i]) return false;
}
return true;
}
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i ++)
{
string a, b;
cin >> a >> b;
for(int j = a.size() - 1 ; j >= 0 ; j --) (ga[i].s).push_back(a[j] - '0');
for(int j = b.size() - 1 ; j >= 0 ; j --) (ga[i].p).push_back(b[j] - '0');
}
for(int i = 1 ; i <= m ; i ++)
{
scanf("%d%d",&pla[i].x,&pla[i].y);
string c;
cin >> c;
for(int j = c.size() - 1 ; j >= 0 ; j --) (pla[i].z).push_back(c[j] - '0');
}
for(int i = 1 ; i <= m ; i ++)
{
for(int j = 1 ; j <= n ; j++)
{
vector<int> C = bigmul(ga[j].s, pla[i].x);
vector<int> D = bigmul(ga[j].p, pla[i].y);
if(cmp1(C, D))
{
vector<int> E = bigminus(C, D);
if(cmp1(E,pla[i].z)) cnt[i] ++;
}
}
}
for(int i = 1 ; i <= m ; i ++) printf("%d\n",cnt[i]);
return 0;
}