SGU 159 - Self-Replicating Numbers
2013-07-28 08:23
351 查看
题意:给你一个b和一个n,求在b进制下的n位数的平方的后n位与其本身相等的所有解
做这个题的时候一开始就尝试了推导一下这个题的规律,发现这个题的解很稀疏,完全可以搜索,然后我通过二项式对其每位进行展开,为了存储处理后的每位数字,我在每个递归栈里面加了一个数组,这样导致了爆栈,开到全局变量后,结果就出现错误了。然后纠结了半天,查过题解才发现,每位只需要判断前面那些位的数,然后存一个下一位的进位就可以了。
爆栈程序:
做这个题的时候一开始就尝试了推导一下这个题的规律,发现这个题的解很稀疏,完全可以搜索,然后我通过二项式对其每位进行展开,为了存储处理后的每位数字,我在每个递归栈里面加了一个数组,这样导致了爆栈,开到全局变量后,结果就出现错误了。然后纠结了半天,查过题解才发现,每位只需要判断前面那些位的数,然后存一个下一位的进位就可以了。
爆栈程序:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; typedef struct { char s[2050]; }ss; int c[4050],b,n; ss A[20]; int ct; int cmp(ss a,ss b) { return strcmp(a.s,b.s)<0; } int dfs(int cur,int mod,int ans[]) { if(cur==n) { for(int i=n-1; i>=0; i--) { A[ct].s[i]=ans[cur-1-i]; } ct++; return 0; } int t[4050]; int st=cur==n-1?1:0; if(cur==0) { for(int i=0;i<mod;i++) { if(i*i%mod==i) { memcpy(t,ans,sizeof(t)); t[cur]=i; t[cur+1]=i*i/mod; dfs(cur+1,mod,t); } } } else for(int i=st; i<mod; i++) { if((ans[cur]+2*ans[0]*i)%mod==i) { memcpy(t,ans,sizeof(t)); t[cur*2]+=i*i; for(int j=0; j<cur; j++) { t[j+cur]+=2*t[j]*i; } t[cur+1]+=t[cur]/mod; t[cur]=i; dfs(cur+1,mod,t); } } } int main() { scanf("%d%d",&b,&n); memset(c,0,sizeof(c)); ct=0; dfs(0,b,c); sort(A,A+ct,cmp); printf("%d\n",ct); for(int i=0;i<ct;i++) { for(int j=0;j<n;j++) { if(A[i].s[j]<10)printf("%d",A[i].s[j]); else printf("%c",A[i].s[j]+'A'-10); } printf("\n"); } return 0; }AC程序:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; typedef struct { char s[2050]; } ss; int ans[4050],b,n; ss A[20]; int ct; int cmp(ss a,ss b) { return strcmp(a.s,b.s)<0; } int dfs(int cur,int st,int mod) { if(cur==n) { if(cur==1||ans[cur-1]) { for(int i=cur-1; i>=0; i--) { A[ct].s[i]=ans[cur-1-i]; } ct++; } return 0; } for(int i=0; i<mod; i++) { int tmp=0; ans[cur]=i; for(int j=0; j<=cur; j++) tmp+=ans[j]*ans[cur-j]; if((st+tmp)%mod==i) { dfs(cur+1,(st+tmp)/mod,mod); } } } int main() { while(scanf("%d%d",&b,&n)==2) { memset(ans,0,sizeof(ans)); ct=0; dfs(0,0,b); sort(A,A+ct,cmp); printf("%d\n",ct); for(int i=0; i<ct; i++) { for(int j=0; j<n; j++) { if(A[i].s[j]<10)printf("%d",A[i].s[j]); else printf("%c",A[i].s[j]+'A'-10); } printf("\n"); } } return 0; }
相关文章推荐
- sgu159:Self-Replicating Numbers
- sgu159 Self-Replicating Numbers DFS+高精
- 离线 + 位优化 - SGU 108 Self-numbers 2
- SGU 159 Self-Replicating Numbers(自复制数)
- 离线 + 位优化 - SGU 108 Self-numbers 2
- sgu 108 Self-numbers 2
- Self-numbers 2 - SGU 108
- sgu 108 Self-numbers 2
- sgu 108-self-numbers 2
- SGU 159.Self-Replicating Numbers
- SGU 108 Self-numbers 2 (另一种滚动数组)
- SGU 108 Self-numbers 2(数论)
- sgu 108 self-numbers 2
- SGU 108 Self-numbers 2
- SGU 108 Self-numbers 2
- HDU1128:Self Numbers(哈希)
- 315.leetcode Count of Smaller Numbers After Self(hard)[利用二分查找 空间换取时间的思想]
- Leetcode Count of Smaller Numbers After Self
- [LeetCode]315. Count of Smaller Numbers After Self
- 315. Count of Smaller Numbers After Self***