#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define stop exit(0) #define nc -1 #define eps 1e-10 #define inf 1000000000 #define mod 1000000007 #define mp make_pair #define fill(array,value) memset(array,value,sizeof(array)) #define f(i,beg,end) for(int i=beg; i<=end; i++) #define F(i,beg,end) for(int i=beg; i>=end; i--) #define Max(a,b) ( (a>b)?a:b ) #define Min(a,b) ( (a lq,rq; vector > vp; map < ll, int > razb; set divisors; vector vpp; stringstream ss; ll gcd(ll a, ll b) { if (b==0) return a; return gcd(b,a%b); } void init() { cin >> a >> b >> k; lq.resize(k); rq.resize(k); f(i,0,k-1) { cin >> lq[i] >> rq[i]; } d = gcd(a,b); while (d%2==0) { razb[2]++; d/=2; } for(ll i=3; i*i<=d; i+=2) { while (d%i==0) { razb[i]++; d/=i; } } if (d>1) { razb[d]++; } vp.push_back(mp(0,0)); for(map::iterator it = razb.begin(); it != razb.end(); it++) { vp.push_back(mp(it->first,it->second)); } vp.push_back(mp(1000000000001LL,0)); } void generateDivisors(int pos, ll currDiv) { if (pos>=vp.size()) { divisors.insert(currDiv); return; } generateDivisors(pos+1,currDiv); ll newDiv = currDiv; for(int i=1; i<=vp[pos].second; i++) { newDiv *= vp[pos].first; generateDivisors(pos+1, newDiv); } } inline int findLessThan(ll num) { int l=0, r=vpp.size()-1, mid; int ans = 0; while (l<=r) { mid = (l+r)/2; if (vpp[mid] < num) { ans = max(ans, mid); l = mid + 1; continue; } if (vpp[mid] > num) { r = mid - 1; continue; } return mid-1; } return ans; // return -100000; // return mid; } inline int findMoreThan(ll num) { int l=0, r=vpp.size()-1, mid; int ans = r; while (l<=r) { mid = (l+r)/2; if (vpp[mid] < num) { l = mid + 1; continue; } if (vpp[mid] > num) { ans = min(ans, mid); r = mid - 1; continue; } return mid+1; } return ans; // return -100000; // return mid; } int ans(ll l, ll r) { int begIndex = findLessThan(l); int lastIndex = findMoreThan(r); // cout << "less than " << l << " is index " << begIndex << endl; // cout << "more than " << r << " is index " << lastIndex << endl << endl;; return lastIndex - begIndex - 1; } void solve() { ll currentNumber = 1LL; generateDivisors(0,1LL); vpp.push_back(0); for(set::iterator it = divisors.begin(); it != divisors.end(); it++) vpp.push_back(*it); vpp.push_back(1000000000001LL); // for(set::iterator it = divisors.begin(); it!=divisors.end(); it++) // { // cout << *it << endl; // } // // cout << " Found " << divisors.size() << "divisors\n"; // f(i,0,vpp.size()-1) // cout << vpp[i] << " "; // cout << endl; f(i,0,lq.size()-1) { ss << ans(lq[i],rq[i]) << "\n"; } cout << ss.str() ; } int main() { input("game.in"); output("game.out"); cin.sync_with_stdio(false); int numberOfTests = 1; // cin >> numberOfTests; f(i,1,numberOfTests) { init(); solve(); } return 0; }