Problem Description:
玩ACM的都知道,入门的第一题一般都是a+b,现在我们来做一个同样简单的问题吧。计算a*b-c.
Input:
输入首先输入一个整数T(1<=T<=100000),代表测试组数,接下来有T组数据,每组数据输入4个整数a,b,c,m(1<=a,b,c,m<=10^18)。
Output:
对于每组测试数据,输出a*b-c的结果,由于数字结果太大了,我们希望取模m之后再输出。
Sample Input:
2
3 5 3 17
3 5 3 10
Sample Output:
12
2
#include <stdio.h>
#include <string.h>
long long mod(long long *ab,long long m){//大数取模
long long ans=0;
for(int i=39;i>=0;i--){
ans=(ans*10+ab[i])%m;
}
return ans;
}
void show(long long *p){//调试
int t=39;
while(p[t]==0)
t--;
for(int i=t;i>=0;i--)
printf("%lld",p[i]);
printf("\n");
}
int main(){
char a[20],b[20];
int t;
long long c,m;
scanf("%d",&t);
while(t--){
scanf("%s%s%lld%lld",a,b,&c,&m);
int len1=strlen(a),len2=strlen(b);
for(int i=0;i<len1;i++)
a[i]-='0';
for(int i=0;i<len2;i++)
b[i]-='0';
int cnt=0;
long long ans[40];
for(int i=0;i<40;i++)
ans[i]=0;
for(int i=len1-1;i>=0;i--){
int k=cnt;
for(int j=len2-1;j>=0;j--){
ans[k++]+=b[j]*a[i];
}
cnt++;
}//大数相乘,用ans数组存a*b
for(int i=0;i<40;i++)
if(ans[i]>9){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}//进位处理
//show(ans);
long long ab=mod(ans,m);
while(ab-c<m)
ab+=m;//如果ab-c<m等会取模会得到负数
printf("%lld\n",(ab-c)%m);
}
return 0;
}