- 欧浩 的博客
倒立数对
- @ 2025-7-18 18:32:18
倒立数对 题解
1.题目
2.分析
数对形式是这样的:(A,,B) A=ab||A=acb B=ba||B=bca 影响两数是否能配对的只关乎到其最高位和最低位,而中位几乎可以忽略不记。联想到之前的统计区间,依旧是可以让之前枚举过的数字记录备用,且只用记录两位,之后倒过来调用。这样的话,我们只用枚举一个数,另一个数通过正在枚举的数的两位颠倒过来就可以查找到了。
3.代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int TOP=2e5+5;
int n;
int t[15][15];
int a[10]={1,10,100,1000,10000,100000,1000000};
int wei=1;
int ans;
signed main()
{
// freopen("number.in","r",stdin);
// freopen("number.out","w",stdout);
int f;
cin>>n;
for(f=1;f<=n;f++)
{
if(f>=a[wei])
wei++;
if(f/a[wei-1]==f%10)
ans++;
//如果两位数相等,则有一位数可匹配
ans+=t[f%10][f/a[wei-1]]*2;
t[f/a[wei-1]][f%10]++;
}
cout<<ans;
return 0;
}
总体实现就是通过一个表(a),记录进位的最小数,且往后统计最高位是也能用上(打表真好用)。用一个二位数组t[f][k],统计高位是f,低位是k的数的数量,就能求出当前数能配成多少对了。
-诚信做人,请勿抄袭-