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

时间:2023-03-08 16:21:24
URAL 1698. Square Country 5(记忆化搜索)

题目链接

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

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

 #include <stdio.h>
#include <string.h>
#include <iostream> using namespace std ;
int n,ans ;
int a[],b[] ; bool check(int k)
{
b[k] = ;
for(int i = ; i <= k ; i++)
{
b[k] += a[i]*a[k-i] ;
}
if(k) b[k] += b[k-]/ ;
return b[k] % == a[k] ;
} void dfs(int k)
{
if(k >= n) return ;
for(int i = ; i >= ; i--)
{
a[k] = i ;
if(check(k))
{
if(a[k]) ans++ ;
dfs(k+) ;
}
}
}
int main()
{
while(~scanf("%d",&n))
{
ans = ;
dfs() ;
printf("%d\n",ans) ;
}
return ;
}