码迷,mamicode.com
首页 > 其他好文 > 详细

URAL 1698. Square Country 5(记忆化搜索)

时间:2014-12-01 14:18:16      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

题目链接

题意 : 自守数的定义:如果某个数的平方的末尾几位数等于这个数,那么就称这个数为自守数。例如5*5=25,则5就是自守数。让你求不超过n位的自守数有多少

思路 : 实际上,自守数还有两个性质:以他为后几位的两个数相乘,乘积的后几位仍是这个自守数。刚好n位的自守数一定是两个,当然1位的时候0和1是没有算进去的,但是题目中1是要加上的,所以从第0位深搜枚举到第n位。还有另一种方法,因为一个数是自守数当且仅当这个数是另一个自守数的后缀,2000位的自守数只有两个,所以存下来直接数也行

bubuko.com,布布扣
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 
 5 using namespace std ;
 6 int n,ans ;
 7 int a[2100],b[2100] ;
 8 
 9 bool check(int k)
10 {
11     b[k] = 0 ;
12     for(int i = 0 ; i <= k ; i++)
13     {
14         b[k] += a[i]*a[k-i] ;
15     }
16     if(k) b[k] += b[k-1]/10 ;
17     return b[k] % 10 == a[k] ;
18 }
19 
20 void dfs(int k)
21 {
22     if(k >= n) return  ;
23     for(int i = 9 ; i >= 0  ; i--)
24     {
25         a[k] = i ;
26         if(check(k))
27         {
28             if(a[k]) ans++ ;
29             dfs(k+1) ;
30         }
31     }
32 }
33 int main()
34 {
35     while(~scanf("%d",&n))
36     {
37         ans = 0 ;
38         dfs(0) ;
39         printf("%d\n",ans) ;
40     }
41     return 0 ;
42 }
View Code

 

URAL 1698. Square Country 5(记忆化搜索)

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/luyingfeng/p/4134852.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!