首页 > 代码库 > HDU 1111 Secret Code (DFS)
HDU 1111 Secret Code (DFS)
题目链接
题意 : 给你复数X的Xr和Xi,B的Br和Bi,让你求一个数列,使得X = a0 + a1B + a2B2 + ...+ anBn,X=Xr+i*Xi,B=Br+Bi*i ;
思路 : 首先要知道复数的基本运算,题目中说0 <= ai < |B| ,|B|代表的是复数的模,|B|=√(Br*Br+Bi*Bi)。将题目中给定的式子X = a0 + a1B + a2B2 + ...+ anBn,进行变型得:X=a0 + (a1 + (a2 + ...(an-1+ an*B))) 。所以这里深搜枚举a的值,从X开始减掉a再除以B,然后看是否成立,是否都为整数,因此要用到复数的除法:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2)+(bc-ad)/(c^2+d^2) ;
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #define LL __int64 5 using namespace std ; 6 7 LL xr,xi; 8 int br,bi ; 9 LL a[110] ,st;10 bool flag ;11 void dfs(LL r,LL i,int step)12 {13 if(step > 100) return ;14 if(flag) return ;15 if(r == 0 && i == 0)16 {17 flag = true ;18 st = step ;19 return ;20 }21 for(int j = 0 ; j * j < br*br+bi*bi ; j++)22 {23 LL xx = (r-j)*br+i*bi;24 LL yy = (i*br)-(r-j)*bi;25 a[step] = j ;26 if(xx % (br*br+bi*bi) == 0 && yy % (br*br+bi*bi) == 0)27 dfs(xx / (br*br+bi*bi) , yy / (br*br+bi*bi),step+1) ;28 if(flag) return ;29 }30 }31 int main()32 {33 int T;34 scanf("%d",&T) ;35 while(T--)36 {37 memset(a,0,sizeof(a)) ;38 st = 0 ;39 flag = false ;40 scanf("%I64d %I64d %d %d",&xr,&xi,&br,&bi) ;41 dfs(xr,xi,0) ;42 if(!flag) puts("The code cannot be decrypted.");43 else {44 printf("%I64d",a[st-1]) ;45 for(int i = st-2 ; i >= 0 ; i -- )46 {47 printf(",%I64d",a[i]) ;48 }49 puts("") ;50 }51 }52 return 0 ;53 }
HDU 1111 Secret Code (DFS)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。