Codeforces Round 1124 (Div. 2)

B.KiaKio and Squared Numbers

Kia 和 Kio 在 Mehragan 港度过了整个夏天。面朝漆黑大海的悬崖上,矗立着 nn 座灯塔。

Mehragan 的灯塔不会发光。每天晚上,人们会在每座灯塔上用火焰写下一个 数字,水手们便依靠这些数字辨认航向。

灯塔遵循这样的规律:如果某座灯塔今晚显示 xx ,那么明晚它显示的就是 xx 的十进制数字中各位数字的 平方和。

例如,一座今晚显示 2323 的灯塔,明晚会显示 22+32=1322+32=13,再下一晚显示 12+32=1012+32=10,之后便显示 11。

在这个季节的第 00 夜,编号为 ii 的灯塔显示数字 aia**i。从那一夜起,每晚都会永远按照上述规律变化。

Kio 称两座灯塔 ii 和 jj 步调一致,如果存在某个夜晚,从那以后直到永远,它们每一晚显示的数字都完全相同。

Kia 想知道:有多少对 (i,j)(i ,j ) 满足 i<ji <j,并且这两座灯塔步调一致?

输入

每个测试包含多组测试用例。第一行包含测试用例数量 tt (1≤t≤10001≤t≤1000)。接下来是各组测试用例的描述。

每组测试用例包含两行。

每组测试用例的第一行包含一个整数 nn (1≤n≤10001≤n≤1000),表示灯塔的数量。

第二行包含 nn 个整数 a1,a2,...,ana 1,a 2,...,a**n (1≤ai≤1091≤a**i≤109),表示每座灯塔在第 00 夜显示的数字。

保证所有测试用例的 nn 之和不超过 10001000。

输出

对于每组测试用例,输出一个整数,表示满足条件的数对 (i,j)(i ,j )(其中 i<ji <j )的数量,使得灯塔 ii 和 jj 步调一致。

样例

Input复制 Output复制
4 5 7 4 16 4 2 4 1 7 10 100 3 4 16 37 3 2 20 4 1 6 0 1

说明

在第一组测试用例中:

  • 灯塔 11 从 77 开始:7→49→97→130→10→17→49→97→130→10→1,之后永远停留在 11。
  • 灯塔 22 和 44 都从 44 开始,因此它们每一晚显示的数字都相同。
  • 灯塔 33 从 1616 开始,灯塔 55 从 22 开始;它们分别处在 Kio 找到的循环中的不同位置,永远不会和其他灯塔相同。

因此,唯一一对步调一致的灯塔是 (2,4)(2,4),答案为 11。

在第二组测试用例中,每座灯塔最终都会到达 11 并永远保持在那里,因此任意两座灯塔都步调一致,共有 66 对。

在第四组测试用例中,第 11 夜,灯塔 22 显示 22+02=422+02=4,而灯塔 11 显示 22=422=4。从第 11 夜起,它们便永远完全相同。灯塔 33 从 44 开始,因此它比前两座灯塔提前了一晚,既不与灯塔 1 步调一致,也不与灯塔 2 步调一致。


这道题困了我好久,开始没看懂题意,可能是大学上的语文用尽废退了吧>^<,理解了好长时间才搞明白题意。大概是讲我们需要找到快乐属的对数,什么是快乐数呢?当我们算数的每个位数的平方和,当我们经过n次,两个数的步调一致,也就是说两个数的平方和相等,以及后面的平方和都相等,那么我们就说这两个数是一对快乐数。

ok,大意理解了,我们应该怎样算呢?我们可以发现如果逐个遍历结ey果为1,那么我们就说这两个数是快乐数,那么我们可以直接循环1000,结果为1的都是快乐数。同理可得,不为1的数也可能是某个数的循环,那么结果相等的都是快乐数。那么我们就可以解出来了。开始题意理解了我也不会写!>-<!看了大佬的代码,又理解了好久,向大佬学习!!ORZORZ

复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define int long long
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second
#define BUG cout<<"debug"<<endl;
const int N=1e9+6;
int f(int x)
{
	int s=0;
	while(x)
	{
		int d=x%10;
		s+=d*d;
		x/=10;
	}
	return s;
}
void solve()
{
	int n;
	cin>>n;
	map<int,int> mp;
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		int x;
		cin>>x;
		for(int j=0;j<=1000;j++)
		{
			x=f(x);
		}
		ans+=mp[x];
		mp[x]++;
	}
	cout<<ans<<endl;
	// cout<<fixed<<setprecision(x)<<;
}
signed main()
{
	ll PPP=1;
	cin>>PPP;
	while(PPP--)
	solve();
	return 0;
}
相关推荐
企业数字化笔记4 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!5 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君6588 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧8 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
Shimeri8 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J9 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang9 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖9 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy9 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
上班摸鱼下班游戏9 小时前
Unity 仿生智能算法 从蚁群算法 开始
算法·unity·游戏引擎