• 【Zoj 4061】Magic Multiplication


    【链接】 我是链接,点我呀:)
    【题意】

    【题解】

    ```cpp /* for a[1] from 1~9 1*1=1 2*1=2 3*1=3 1*2=2 2*2=4 3*2=6 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 1*5=5 2*5=10 3*5=15 1*6=6 2*6=12 3*6=18 1*7=7 2*7=14 3*7=21 1*8=8 2*8=16 3*8=24 1*9=9 2*9=18 3*9=27 use "c[i]" or "c[i]c[i+1]" % a[1] if (c[i]%a[1]==0) then b[i] must be c[i]/a[1] else if (c[i]c[i+1]%a[i]==0) b[i] must be c[i]c[i+1]/a[1] they won't be true at the same time. Because,when x*y>=10,x*y%10 < x (1<=x,y<=9) so you won't confuse c[i] and c[i]c[i+1] if (c[i]c[i+1]%a[1]==0){ Scince c[i]c[i+1]>10 so,c[i]=c[i]c[i+1]%10=10 even though c[i]c[i+1]%a[1]==0 ```

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 2e5;
    
    int n,m,l;
    char s[N+10];
    int a[N+10],b[N+10],c[N+10];
    
    bool test(int a1){
     	a[1] = a1;
    
    	//get string b                  
    	int cur = 1;
    	for (int i = 1;i <= m;i++){//for b's each position
    		 if (cur>l) return false;
    		 //break limit,unaccpted
    		 if (c[cur]%a1==0){//only one position
    		 	 b[i] = c[cur]/a1;//get b[i]
    		 	 cur++;
    		 }else if (cur+1<=l && (c[cur]*10+c[cur+1])%a1==0){//twoposition
    			 b[i] = (c[cur]*10+c[cur+1])/a1;//get b[i]
    			 if (b[i]>=10) return false;
    			 cur+=2;
    		 }else return false;//no accpted
    	}
    
    
    	//use b and c,get string a
    	for (int i = 2;i <= n;i++){
    	 	if (cur>l) return false;
    
    	 	if (c[cur]%b[1]==0){
    	 	 	a[i] = c[cur]/b[1];
    	 	 	cur++;
    	 	}else if (cur+1<=l && (c[cur]*10+c[cur+1])%b[1]==0) {
    	 	 	a[i] = (c[cur]*10+c[cur+1])/b[1];
    	 	 	if (a[i]>=10) return false;
    	 	 	cur+=2;
    	 	}else return false;
    
    	 	//got a[i]
    
    	 	//use a[i] to check c[cur],c[cur+1]....
    	 	for (int j = 2;j <= m;j++){
    	 		if (cur>l) return false;
    	 	 	int _ju = a[i]*b[j];
    	 	 	//if (a1==2) printf("%d
    ",_ju);
    	 	 	if (_ju<=9 && c[cur]==_ju){
    	 	 	 	cur++;
    	 	 	}else if ( _ju>=10 && c[cur]==(_ju/10) && cur+1<=l && 
    	 	 	c[cur+1]==(_ju%10) )  cur+=2;
    	 	 		else return false; 
    	 	}
    	}
    	//
    	if (cur!=l+1) return false;
    	return true;
    }
    
    
    int main(){
    //	freopen("rush.txt","r",stdin);
    	int T;
    	scanf("%d",&T);
    	while (T--){
    		scanf("%d%d",&n,&m);		
    		scanf("%s",s+1);
    		l = strlen(s+1);
    		for (int i = 1;i <= l;i++) c[i] = s[i]-'0';
    		int ok = 0;
    		for (int i = 1;i <= 9;i++)
    			if (test(i)){
    			 	ok = 1;
    			 	break;
    			}
    		if (ok==0){
    		 	puts("Impossible");
    		}else{
    		 	for (int i = 1;i <= n;i++) printf("%d",a[i]);printf(" ");
    		 	for (int i = 1;i <= m;i++) printf("%d",b[i]);
    		 	puts("");
    		}
    	}
     	return 0;
    }
    
  • 相关阅读:
    冒泡排序
    pdo 单例类
    php 事物处理
    支付宝支付
    反向代理和负载均衡
    execl导出
    网络层
    OSI 7层 TCP/IP 4层 综合5层
    面试总结
    CMD AMD
  • 原文地址:https://www.cnblogs.com/AWCXV/p/9916508.html
Copyright © 2020-2023  润新知