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; } } }