ATcoder D - Handstand 2

题目大意:

给一个数N,在小于N的所有数中,找到(A,B)的数量,其中A的第一个数字要等于B的最后的一个数字,A的最后一个数字要等于B的第一个数字。

题解:对从1到N的所有数x,用一个二维数组保存dp[a][b]其中a是x的第一个数字,b是x的最后一个数字。答案就是dp[a][b]*dp[b][a]。。嗯嗯~~~秒

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=100;
ll dp[N][N];
ll find(ll x){
    while(x){
        if(x/10==0){
            return x;
        }
        x/=10;
    }
}
int main()
{
    ll n;
    cin>>n;
    for(ll i=1;i<=n;i++){
        ll h=i;
        ll a1=h%10;
        ll a2=find(h);
        dp[a2][a1]++;
    }
    ll ans=0;
    for(ll i=1;i<=9;i++){
        for(ll j=1;j<=9;j++){
            ans+=dp[i][j]*dp[j][i];
        }
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Accepting/p/12221376.html