Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- long long n,m,ans;
- long long gcd(long long a,long long b,long long & x, long long & y){
- if (a==0){
- x=0;y=1;
- return b;
- }
- long long x1,y1;
- long long d=gcd(b%a,a,x1,y1);
- x=y1-(b/a)*x1;
- y=x1;
- return d;
- }
- long long ceill(long long a){
- return 2/a+((2%a)?1:0);
- }
- void input(){
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- scanf("%I64d%I64d",&n,&m);
- }
- void upd_ans(long long a,long long b){
- long long x,y;
- long long g=gcd(a,b,x,y);
- if (ceill(a)>(n+1)/a) return;
- if (g!=1) return;
- if (x<0) x+=-x*b+b;
- long long x_min=x%b,w=(n+1)/a;
- if (x_min==1 && a==1 || x_min<ceill(a)) x_min+=b;
- if (x_min>w) return;
- ans+=(w-x_min)/b+1;
- }
- int main(void){
- input();
- long long t=m+m;
- for (long long i=1;i*i<=t;i++) if (t%i==0){
- upd_ans(i,t/i);
- if (i*i!=t) upd_ans(t/i,i);
- }
- printf("%I64d",ans);
- }
Advertisement
Add Comment
Please, Sign In to add comment