题目

Description

对给定的整数X, 统计出小于等于X的整数中满足这样条件的正整数的个数,其平方数为一个9位数,并且其各位数字各不同。

Input

第1行 是测试数据的组数t,每组测试数据占一行,每行包括一个位长为5位的正整数X.

Output

对应每组测试数据输出共t行,每行为满足条件的数的个数。

Sample Input

2
10000
60000

Sample Output

0
83

题解

平方是 9 位数的数满足 [10000,31622]
判断 10000 ~ min(n,31622) 之间所有的数的平方

对于每个数判断每一位是不是相同即可

要注意,题目要求是小于等于

代码

/*
By:OhYee
Github:OhYee
Blog:http://www.oyohyee.com/
Email:oyohyee@oyohyee.com
 
かしこいかわいい?
エリーチカ!
要写出来Хорошо的代码哦~
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <functional>
using namespace std;
 
bool vis[10];
void Do() {
    int n;
    scanf("%d",&n);
 
    int cnt = 0;
    for(int i = 10000;i <= 31622 && i <= n;i++) {
        memset(vis,false,sizeof(vis));
        bool flag = true;
 
        int k = i*i;
        while(k) {
            if(vis[k % 10]) {
                flag = false;
                break;
            }
            vis[k % 10] = true;
            k /= 10;
        }
        if(flag)
            cnt++;
    }
    printf("%d\n",cnt);
}
 
int main() {
    int T;
    scanf("%d",&T);
    while(T--)
        Do();
    return 0;
}