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;
}
相关推荐
垆边人似月.2 小时前
任务混部(200 分档)
算法
言乐62 小时前
Python区分广度优先深度优先宽度优先的区别
python·算法·深度优先·广度优先·宽度优先
如意猴3 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
朝朝辞暮i3 小时前
C++ 第 32 课:main()、rclcpp::init()、spin()、shutdown()
开发语言·c++·算法
朝朝辞暮i5 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
Evand J5 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
海绵宝宝转agent6 小时前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼6 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
hahaha60166 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉