#include #include typedef unsigned __int128 u128; typedef unsigned long long u64; int main(int c,char**v){ u64 F=strtoull(v[1],0,10),C=strtoull(v[2],0,10),Q=strtoull(v[3],0,10); const u64 CAP=90000000000000000ULL,E=9740,N=12960,CPY=1051920,END=N*E; u64 iss=0,s=0,eT=0,dT=0,mx=0; for(u64 h=1;h<=END+5;h++){ u64 r=0; if(h<=END){ u64 k=(h-1)/E; if((h-1)%E==0){ if(k) F=(u64)(((u128)F*Q)>>40); u64 m=2*N-2*k-1; s=(u64)(((u128)(F+C)*m*m)/(4*N*N)); s-=s&1; } r=s; if(h==END) r=CAP-iss; } if(r&1){printf("ODD at %llu\n",h);return 1;} iss+=r; eT+=r/2; dT+=r/2; if(iss>CAP){printf("OVER CAP at %llu\n",h);return 1;} if(h%CPY==0) printf("Y %llu %llu\n",h,iss); if((h-1)%E==0) printf("R %llu %llu\n",h,r); if(h==END) printf("FINAL h=%llu reward=%llu\n",h,r); } printf("TOTAL %llu cap_exact=%d E=%llu D=%llu\n",iss,iss==CAP,eT,dT); return 0; }