这个题思路对了就能模拟出,但是数据大了就不知道能不能跑了。
举例:
对x进制数321,进制分别为 8 10 2 ,转化为10进制数65.
百位 | 十位 | 个位 | |
X进制数 | 3 | 2 | 1 |
X进制 | 8 | 10 | 2 |
转换10进制 | 3*10+2=32 | 32*2+1=65 |
如上表,高位数字就是低位数字的进制溢出上去的。
所以计算的时候反推回去
思路:
对于数字A=a(n+1) an a(n-1) a(n-2)……a3 a2 a1 (每个an对应一个位),进制为X=x(n+1) xn x(n-1) x(n-2)……x3 x2 x1
位 | n+1 | n | n-1 | … | 2 | 1 |
数字A(X进制) | a(n+1) | an | a(n-1) | … | a2 | a1 |
X进制 | x(n+1) | xn | x(n-1) | … | x2 | x1 |
计算为B(十进制) | a(n+1)*xn+an | an*x(n-1)+a(n-1) | … | a3*x2+a2 | a2*x2+a1 |
计算:
X进制计算为10进制:第n位数的数值为:an= a(n+1)*xn+an
这样从高位往低位计算,最后得到的a1的位置,就是数字A(X进制)转化为的B(十进制)
题目思路:
所以,在做题目的时候,就按照这种思路模拟。
这里现将A减去B,然后再将结果由X进制转化为10进制。
这里可以在转化的每个位数的地方都模上1000000007,就不用担心出界了。
对于题目的最小,每位数的进制肯定是最小,也就是A和B每位数最大的数字+1。
代码:
#include
using namespace std;
int n,a[100003],b[100003],c[100003],ma,mb;
int main(){
cin>>n;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>ma;
int i;
for(i=ma;i>=1;i--)
cin>>a[i];
cin>>mb;
for(i=mb;i>=1;i--)
{
cin>>b[i];
c[i]=a[i]>b[i]?a[i]:b[i]; //每位数的进制对应最大+1
c[i]++;
}
for(i=ma;i>mb;i--) // 对A比B超出的位数移植
c[i]=a[i]+1;
for(i=ma;i>=1;i--) // 最小的进制是2,这里如果两个数都是0,就变为2进制
{
if(c[i]<=2)
c[i]=2;
if(c[i]>n)
c[i]=n;
}
int aa,bb;
for(i=ma;i>1;i--)
{
aa=a[i]*c[i-1]+a[i-1];
bb=b[i]*c[i-1]+b[i-1]; //主要是对b的第一个数做运算,后面bb=b[i-1]
a[i-1]=(aa-bb)%1000000007;
b[i-1]=0;
}
cout<
执行结果展示:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)