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;
}