Tranvick

День святого байта

Jan 5th, 2012
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.87 KB | None | 0 0
  1. #include <cstdio>
  2.  
  3. long long n,m,ans;
  4.  
  5. long long gcd(long long a,long long b,long long & x, long long & y){
  6.     if (a==0){
  7.         x=0;y=1;
  8.         return b;
  9.     }
  10.     long long x1,y1;
  11.     long long d=gcd(b%a,a,x1,y1);
  12.     x=y1-(b/a)*x1;
  13.     y=x1;
  14.     return d;
  15. }
  16.  
  17. long long ceill(long long a){
  18.     return 2/a+((2%a)?1:0);
  19. }
  20.  
  21. void input(){
  22.     freopen("input.txt","r",stdin);
  23.     freopen("output.txt","w",stdout);
  24.     scanf("%I64d%I64d",&n,&m);
  25. }
  26.  
  27. void upd_ans(long long a,long long b){
  28.     long long x,y;
  29.     long long g=gcd(a,b,x,y);
  30.     if (ceill(a)>(n+1)/a) return;
  31.     if (g!=1) return;
  32.     if (x<0) x+=-x*b+b;
  33.     long long x_min=x%b,w=(n+1)/a;
  34.     if (x_min==1 && a==1 || x_min<ceill(a)) x_min+=b;
  35.     if (x_min>w) return;
  36.     ans+=(w-x_min)/b+1;
  37. }
  38.  
  39. int main(void){
  40.     input();
  41.     long long t=m+m;
  42.     for (long long i=1;i*i<=t;i++) if (t%i==0){
  43.         upd_ans(i,t/i);
  44.         if (i*i!=t) upd_ans(t/i,i);
  45.     }
  46.     printf("%I64d",ans);
  47. }
Advertisement
Add Comment
Please, Sign In to add comment