fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <unordered_map>
  4. #include <cmath>
  5. using namespace std;
  6.  
  7. bool prime (int x){ //функция для проверки простоты нечётного числа
  8. bool pr=true;
  9. for(int i=2; i<=sqrt(x);i++)if(!(x%i))pr=false;
  10. return pr;
  11. }
  12. int main() {
  13. vector <int> v,prime_v;
  14. unordered_map <int,bool> prime_m;
  15. int u,i,j,maxx=0;
  16. while(cin>>u){
  17. v.push_back(u);
  18. maxx=max(maxx,u);//максимальное значение во входном потоке
  19. }
  20. for(i=3;i<=maxx;i+=2){
  21. if(prime(i)){
  22. prime_m[i]=true;
  23. prime_v.push_back(i);
  24. }
  25. }
  26. int *dp,k;
  27. dp = new int [maxx+1];
  28. for(i=0;i<=maxx;i++)dp[i]=0;
  29. for(i=8;i<=maxx;i++){//динамика
  30. if(i%2){
  31. for(j=0;(j<prime_v.size())&&(prime_v[j]<i);j++){
  32. k=i-prime_v[j];
  33. if(dp[k]){
  34. dp[i]+=dp[k];
  35. if((prime_m[k-prime_v[j]])&&((k-prime_v[j])!=prime_v[j]))--dp[i];
  36. }
  37. }
  38. }
  39. else{
  40. for(j=0;(j<prime_v.size())&&(prime_v[j]<(i/2));j++){
  41. k=i-prime_v[j];
  42. if(prime_m[k])dp[i]++;
  43. }
  44. }
  45. if(i%2)dp[i]/=3;
  46. }
  47. for(i=0;i<v.size();i++)cout<<dp[v[i]]<<'\n';
  48. return 0;
  49. }
Success #stdin #stdout 0.42s 15872KB
stdin
20000
stdout
231