题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/1111914599412858886

题意:略

思路:     

           比赛时自己想到思路了,可是怎么写都不对,可怕的是比赛的编译器还不带调试的(这些东西不是应该要比赛前给选手配置好吗,服了)。回来自己写了几分钟就一发过了。哎。。。。

这个题呢,也没什难度,开头先打一个素数表,然后对范围内的数逐一判断就好了,记得记忆化一下减小复杂度(不记忆化不知道能不能过,没试),还有一个点就是我们判断一个数的过程中所涉及到的数记得标记一下这些都不是合法的

 

#include<bits/stdc++.h>
using namespace std;

#define ll long long 
#define INF 0x3f3f3f3f
const int maxn = 1000 * 100 * 3 + 10;
int n, m,num[maxn],vis[maxn],p[maxn];

void init() {
	memset(p,0,sizeof(p));
	memset(vis,0,sizeof(vis));
	memset(num,0,sizeof(num));
	num[1] = 1;
	for (int i = 2; i*i < maxn; i++)
		if (!vis[i])
			for (int j = 2; j*i < maxn; j++)p[i*j] = 1;
}

int work(int x) {
	int sum = 0;
	while (x) {
		int k = x % 10;
		x /= 10;
		sum += k * k;
	}
	return sum;
}

int dfs(int x) {
	if (x == 1)return num[1];
	if (vis[x])return num[x];
	vis[x] = 1;
	int k = work(x);
	int ans = dfs(k);
	if(k>=n&&k<=m)vis[k] = 2;
	if (ans)return num[x] = ans + 1;
	else
		return 0;
}

int main() {
	ios::sync_with_stdio(false);
	init();
	cin >> n >> m;
	for (int i = n; i <= m; i++)
		if (!vis[i])dfs(i);

	bool f = true;
	for (int i = n; i <= m; i++) {
		if (num[i] && vis[i] != 2) {
			f = false;
			if (p[i] == 0)
				cout << i << ' ' << (num[i]-1) * 2<<endl;
			else
				cout << i << ' ' << (num[i]-1)<<endl;
		}
	}

	if (f)puts("SAD");

	return 0;
}