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;
}
相关推荐
青少儿编程课堂22 分钟前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄1 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus11 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Code_Solitude18 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司18 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP21 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀21 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落1 天前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Pniubi1 天前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表