Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1. #include<vector>
  2. #include<iostream>
  3. #include<cmath>
  4.  
  5. int main(){
  6.  
  7. std::vector<char> list;
  8. const unsigned long MOD_NUM = 1000000007;
  9. unsigned long long invariant = 0;
  10. unsigned long long num_zextra = 0;
  11. unsigned long long pow_2 = 0;
  12. unsigned long num_0 = 0;
  13. unsigned long num_Q = 0;
  14. unsigned long long total = 0;
  15. unsigned long long output = 0;
  16.  
  17. char ele = 0;
  18. char current_ele = 0;
  19.  
  20.  
  21. //filling list
  22. std::cin.get(ele);
  23. while(ele!= '\n'){
  24. list.push_back(ele);
  25. std::cin.get(ele);
  26. }
  27.  
  28. //counting number of inversions
  29. while(!list.empty()){
  30. current_ele = list.back();
  31. switch(current_ele){
  32. case '0':
  33. num_0++;
  34. break;
  35.  
  36. case '?':
  37. pow_2>0?pow_2*=2:pow_2=1;
  38. total+=total+invariant + pow_2*(num_0);
  39. //std::cout<<pow(2,num_Q)<<std::endl;
  40. //std::cout<<total<<std::endl;
  41. invariant+=invariant + pow_2;//update invariant to K of n+1. we use num_Q - 1 since we haven't seen the next ?
  42. //std::cout<<invariant<<'I'<< pow_2<< 'P'<<std::endl;
  43. break;
  44.  
  45. case '1':
  46. if(pow_2 > 0){
  47. total+=invariant+num_0*pow_2*2;
  48. }
  49. else{
  50. total+=num_0;
  51. }
  52. break;
  53. }
  54. if(total > MOD_NUM){
  55. total = total % MOD_NUM;
  56. invariant = invariant % MOD_NUM;
  57. num_0 = num_0 % MOD_NUM;
  58. pow_2 = pow_2 % MOD_NUM;
  59. num_Q=num_Q%MOD_NUM;
  60. }
  61. list.pop_back();
  62. }
  63. //output= total%(1000000007*(pow(10,9)+7));
  64. std::cout<<total;
  65. return 0;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement