题解
1.题目对 \(i,j\) 没有限制,也就是说,i可以大于j,可以小于j,也可以等于j
2.找普适规律。不管谁和谁成功配对,要么两个数长度相等;要么前面的数长度大于后面的数,于是前面的数分后半部分出来;要么后面的数大于前面的数,于是后面的数分前半部分出来;
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll ten[7];
ll a[200005];
int main()
{
ten[0]=1;
for(ll i=1;i<=6;i++) ten[i]=ten[i-1]*10;
ll n;
cin>>n;
ll ans=0;
for(ll i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
map<ll,ll> dp[7];
for(ll i=1;i<=n;i++)
{
ll x=a[i];
ll sum=0,len=0,tem=x;
while(tem)
{
sum+=tem%10;
len++;
tem/=10;
}
ans+=dp[len][sum]*2;//左右呼唤
ll pre=0;
for(ll j=len;j>=len/2+2;j--)//后面的数分前半部分出来
{
pre=pre+x/ten[j-1]%10;//是数字之和不是数字截取
ans+=dp[(j-1)-(len-(j-1))][sum-pre-pre];
}
pre=0;
for(ll j=1;j<=len/2-(1-len%2);j++)//前面的数分后半部分出来
{
pre=pre+x/ten[j-1]%10;
ans+=dp[len-j-j][sum-pre-pre];
}
dp[len][sum]++;
}
cout<<ans+n;
return 0;
}
标签:pre,ten,要么,ll,Torn,Lucky,数分,Ticket,后面
From: https://www.cnblogs.com/pure4knowledge/p/18162124