分享

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

 怡红公子0526 2022-12-11 发布于北京

https://ac./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;
        }
    }
}

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多