• Source
    1. #include<bits/stdc++.h>
    2. #define MAX 1000009
    3.  
    4. using namespace std;
    5.  
    6. bool arr[MAX];
    7.  
    8. vector<int>prime;
    9.  
    10. vector<int>check;
    11.  
    12. void sieve()
    13. {
    14. int i,j,k;
    15.  
    16. k = sqrt(MAX);
    17.  
    18. prime.push_back(2);
    19.  
    20. for(i=3; i<=k; i+=2)
    21. {
    22. if(arr[i]==0)
    23. {
    24. for(j=i*i; j<MAX; j+=i+i)
    25. {
    26. arr[j]=1;
    27. }
    28. }
    29. }
    30.  
    31. for(i=3; i<MAX; i+=2)
    32. if(arr[i]==false)
    33. prime.push_back(i);
    34.  
    35. int sz = prime.size();
    36.  
    37. for(i=0; i<sz; i++)
    38. {
    39. string s;
    40.  
    41. stringstream ss;
    42.  
    43. ss<<prime[i];
    44.  
    45. s = ss.str();
    46.  
    47. int len = s.length();
    48.  
    49. int sum = 0;
    50.  
    51. for(j=0; j<len; j++)
    52. {
    53. sum+=(s[j]-48);
    54. }
    55.  
    56. if(sum==2)
    57. {
    58. check.push_back(prime[i]);
    59. }
    60. else if(arr[sum]==false && (sum&1))
    61. {
    62. check.push_back(prime[i]);
    63. }
    64. }
    65.  
    66. sort(check.begin(),check.end());
    67. }
    68.  
    69. int main()
    70. {
    71. sieve();
    72.  
    73. int test,from,to;
    74.  
    75. scanf("%d",&test);
    76.  
    77. while(test--)
    78. {
    79. scanf("%d%d",&from,&to);
    80.  
    81. vector<int>::iterator low,high;
    82.  
    83. low = lower_bound(check.begin(),check.end(),from);
    84.  
    85. high = upper_bound(check.begin(),check.end(),to);
    86.  
    87. int res = (high-check.begin())-(low-check.begin());
    88.  
    89. printf("%d\n",res);
    90. }
    91.  
    92. return 0;
    93. }