题目大意:
给一个数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; }