• Source
    1. #include <iostream>
    2. #include <vector>
    3. using namespace std;
    4. const int N=110000;
    5. int sumofDivisors(int x, const vector<int>& primes)
    6. {
    7. int ans=1;
    8. for(int i=0;i<primes.size() && x!=1;++i)
    9. {
    10. int pow=1;
    11. int curSum=1;
    12. while( x%primes[i]==0)
    13. {
    14. x/=primes[i];
    15. pow*=primes[i];
    16. curSum+=pow;
    17. }
    18. ans*=curSum;
    19. }
    20. return ans;
    21. }
    22. int main()
    23. {
    24. vector<bool> mark(N+100,false);
    25. vector<int> primes;
    26. for(int i=2;i<=N;++i)
    27. {
    28. if(!mark[i])
    29. {
    30. int b=i+i;
    31. while(b<=N)
    32. {
    33. mark[b]=true;
    34. b+=i;
    35. }
    36. }
    37. }
    38. for(int i=2;i<=N;++i)
    39. if(!mark[i])
    40. primes.push_back(i);
    41. vector<bool> markAns(N+100,false);
    42. vector<int> nums;
    43. for(int i=10;i<=N;++i)
    44. if( sumofDivisors(i,primes)-i>i)
    45. {
    46. markAns[i]=true;
    47. nums.push_back(i);
    48. }
    49. int t;
    50. cin>>t;
    51. for(int k=1;k<=t;++k)
    52. {
    53. int n;
    54. cin>>n;
    55. if(n>28123)
    56. {
    57. cout<<"YES"<<endl;
    58. continue;
    59. }
    60. bool ans=false;
    61. for(int i=0;i<nums.size();++i)
    62. if( nums[i]<n && markAns[n-nums[i]])
    63. ans=true;
    64. if(ans)
    65. cout<<"YES"<<endl;
    66. else
    67. cout<<"NO"<<endl;
    68. }
    69.  
    70.  
    71. }