牛客不进位乘法(dfs+数学)

https://ac.nowcoder.com/acm/contest/12606/C

题意:定义运算a⊗b为a乘b无进位的结果,现在给一个数n,找到最小的a,使得a⊗a等于n

 

 

 

 

看了这个题就知道了,如果答案是x位数,那么相乘的数就是2*x-1.

然后还有一个规律,就是 c[k] = a[1]⊗b[k] + a[2]⊗b[k-1] + … + a[k]⊗[b1]

然后这个c[k]就是[0-9]可以暴力求的。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e6+100; 
char s[maxn];
int b[maxn];
int a[maxn];
int len=0;
int flag=0;
void dfs(int pos){
    if(pos>len&&!flag){
        flag=1;
        for(int i=1;i<=(len+1)/2;i++){
            cout<<a[i];
        }
        return ;
    }
    if(flag){
        return ;
    }
    for(int i=0;i<=9;i++){//暴力枚举这个数 
        a[pos]=i;
        int sum=0;
        for(int j=1;j<=pos;j++){
            sum+=(a[j]*a[pos-j+1]);
        }
        if(sum%10==b[pos]){
            dfs(pos+1);
        }
    } 
}
int main(){
    scanf("%s",s+1);
    len=strlen(s+1);
    for(int i=1;i<=len;i++){
        b[i]=(s[i]-'0');
    }    
    if(len%2==0){
        cout<<-1<<endl;
    }
    else{
        dfs(1);
        if(!flag){
            cout<<-1<<endl;
        }
    }
}

 

 

 

 

posted @ 2021-03-08 22:50  哎呦哎(iui)  阅读(112)  评论(0编辑  收藏  举报