【HDOJ6646】A + B = C(模拟)
题意
1<=a,b,c<=1e100000
思路:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef pair<int,int> PII; 7 typedef pair<ll,ll> Pll; 8 typedef vector<int> VI; 9 typedef vector<PII> VII; 10 #define N 1100000 11 #define M 4100000 12 #define fi first 13 #define se second 14 #define MP make_pair 15 #define pi acos(-1) 16 #define mem(a,b) memset(a,b,sizeof(a)) 17 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++) 18 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--) 19 #define lowbit(x) x&(-x) 20 #define Rand (rand()*(1<<16)+rand()) 21 #define id(x) ((x)<=B?(x):m-n/(x)+1) 22 #define ls p<<1 23 #define rs p<<1|1 24 25 const ll MOD=1e9+7,inv2=(MOD+1)/2; 26 double eps=1e-6; 27 int INF=1e9; 28 29 char a[N],b[N],c[N]; 30 int A[N],B[N],C[N],t[N],flag,la,lb,lc; 31 32 int read() 33 { 34 int v=0,f=1; 35 char c=getchar(); 36 while(c<48||57<c) {if(c=='-') f=-1; c=getchar();} 37 while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar(); 38 return v*f; 39 } 40 41 void solve1() 42 { 43 int na=0,nc=0; 44 rep(i,1,1e6+1) A[i]=B[i]=C[i]=t[i]=0; 45 rep(i,1,1e6-la) A[++na]=0; 46 per(i,la,1) A[++na]=a[i]-'0'; 47 rep(i,1,1e6-lc) C[++nc]=0; 48 per(i,lc,1) C[++nc]=c[i]-'0'; 49 int p=1; 50 per(i,1e6,1) 51 { 52 if(C[i]>A[i]) break; 53 if(C[i]<A[i]){p=0; break;} 54 } 55 if(!p) return; 56 rep(i,1,1e6) 57 { 58 t[i]=t[i]+C[i]-A[i]; 59 if(t[i]<0) 60 { 61 t[i+1]--; 62 t[i]+=10; 63 } 64 } 65 p=1; 66 int k=1e6; 67 while(k>1&&t[k]==0) k--; 68 per(i,k/2,1) swap(t[i],t[k-i+1]); 69 rep(i,1,lb) 70 if((b[i]-'0')!=t[i]){p=0; break;} 71 if(p) 72 { 73 flag=1; 74 printf("%d %d %d\n",1000000-la,k-lb,1000000-lc); 75 } 76 } 77 78 void solve2() 79 { 80 if(flag) return; 81 rep(i,1,1e6+1) A[i]=B[i]=C[i]=t[i]=0; 82 int nb=0,nc=0; 83 rep(i,1,1e6-lb) B[++nb]=0; 84 per(i,lb,1) B[++nb]=b[i]-'0'; 85 rep(i,1,1e6-lc) C[++nc]=0; 86 per(i,lc,1) C[++nc]=c[i]-'0'; 87 int p=1; 88 per(i,1e6,1) 89 { 90 if(C[i]>B[i]) break; 91 if(C[i]<B[i]){p=0; break;} 92 } 93 if(!p) return; 94 rep(i,1,1e6) 95 { 96 t[i]=t[i]+C[i]-B[i]; 97 if(t[i]<0) 98 { 99 t[i+1]--; 100 t[i]+=10; 101 } 102 } 103 p=1; 104 int k=1e6; 105 while(k>1&&t[k]==0) k--; 106 per(i,k/2,1) swap(t[i],t[k-i+1]); 107 rep(i,1,la) 108 if((a[i]-'0')!=t[i]){p=0; break;} 109 if(p) 110 { 111 flag=1; 112 printf("%d %d %d\n",k-la,1000000-lb,1000000-lc); 113 } 114 } 115 116 void solve3() 117 { 118 if(flag) return; 119 rep(i,1,1e6+1) A[i]=B[i]=C[i]=t[i]=0; 120 int na=0,nb=0,nc=0; 121 rep(i,1,1e6-1-la) A[++na]=0; 122 per(i,la,1) A[++na]=a[i]-'0'; 123 rep(i,1,1e6-1-lb) B[++nb]=0; 124 per(i,lb,1) B[++nb]=b[i]-'0'; 125 rep(i,1,1e6-lc) C[++nc]=0; 126 per(i,lc,1) C[++nc]=c[i]-'0'; 127 rep(i,1,1e6) 128 { 129 t[i]=t[i]+A[i]+B[i]; 130 if(t[i]>9) 131 { 132 t[i]-=10; 133 t[i+1]++; 134 } 135 } 136 int p=1; 137 rep(i,1,1e6+1) 138 if(t[i]!=c[i]){p=0; break;} 139 if(p) 140 { 141 flag=1; 142 printf("%d %d %d\n",1000000-1-la,1000000-1-lb,1000000-lc); 143 } 144 } 145 146 int main() 147 { 148 //freopen("1.in","r",stdin); 149 int cas; 150 scanf("%d",&cas); 151 while(cas--) 152 { 153 scanf("%s",a+1); 154 scanf("%s",b+1); 155 scanf("%s",c+1); 156 la=strlen(a+1),lb=strlen(b+1),lc=strlen(c+1); 157 //printf("la=%d lb=%d lc=%d\n",la,lb,lc); 158 flag=0; 159 solve1(); 160 solve2(); 161 solve3(); 162 if(!flag) printf("-1\n"); 163 } 164 165 return 0; 166 }
null