• Source
    1. #include <iostream>
    2. #include <string>
    3. #include <map>
    4. #include <queue>
    5. #include <vector>
    6.  
    7. using namespace std;
    8.  
    9. int solve(int p,int q) {
    10. // ある素数からある素数への変換が可能な組を管理するmultimap
    11. multimap<int,int> pe;
    12. {
    13. vector<bool> isprime(q+1,true);
    14. isprime[0]=false;
    15. isprime[1]=false;
    16. // エラトステネスの篩による、q以下の数の素数/非素数判別
    17. for ( int i=2; i*i<=q; i++ ) {
    18. if ( isprime[i] ) {
    19. for ( int j=i*i; j<=q; j+=i ) {
    20. isprime[j]=false;
    21. }
    22. }
    23. }
    24.  
    25. // 変換可能な素数のペアを ( 双方向で ) 登録
    26. for ( int i=11; i<=q; i+=2 ) {
    27. if ( isprime[i] ) {
    28. int irtrim=i/10;
    29. if ( isprime[irtrim] ) {
    30. pe.insert(pair<int,int>(i,irtrim));
    31. pe.insert(pair<int,int>(irtrim,i));
    32. }
    33. string i_s=to_string(i);
    34. if ( i_s[1]!='0' ) {
    35. int iltrim=stoi(i_s.substr(1));
    36. if ( isprime[iltrim] ) {
    37. pe.insert(pair<int,int>(i,iltrim));
    38. pe.insert(pair<int,int>(iltrim,i));
    39. }
    40. }
    41. }
    42. }
    43. }
    44.  
    45. // BFS用の、距離・素数のペアのキュー
    46. queue<pair<int,int>> bfsq;
    47. // 探索済み素数を登録するmap
    48. map<int,bool> done;
    49. done[p]=true;
    50. // pから開始
    51. bfsq.push(pair<int,int>(0,p));
    52. while ( !bfsq.empty() ) {
    53. auto ip=bfsq.front();
    54. bfsq.pop();
    55. int d=ip.first,curp=ip.second;
    56. auto itp=pe.equal_range(curp);
    57. for ( auto it=itp.first; it!=itp.second; it++ ) {
    58. int nextp=it->second;
    59. // 目的のqに到着
    60. if ( nextp==q ) {
    61. return d+1;
    62. }
    63. // doneに登録されていない、すなわち未探索の素数の場合
    64. if ( done.find(nextp)==done.end() ) {
    65. bfsq.push(pair<int,int>(d+1,nextp));
    66. done[nextp]=true;
    67. }
    68. }
    69. }
    70. return -1;
    71. }
    72.  
    73. int main(void) {
    74. int p,q;
    75. cin>>p>>q;
    76. cout<<solve(p,q)<<endl;
    77. }