1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| #include<bits/stdc++.h> #define int long long #define ull unsigned long long #define maxn 2000005 #define put() putchar('\n') #define Tp template<typename Ty> #define Ts template<typename Ty,typename... Ar> using namespace std; inline void read(int &x){ int f=1;x=0;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();} x*=f; } namespace Debug{ Tp void _debug(char* f,Ty t){cerr<<f<<'='<<t<<endl;} Ts void _debug(char* f,Ty x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);} Tp ostream& operator<<(ostream& os,vector<Ty>& V){os<<"[";for(auto& vv:V) os<<vv<<",";os<<"]";return os;} #define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__) }using namespace Debug; int T,m1,m2,n; int a[maxn]; int d1[maxn],d2[maxn],dp[maxn],prime[maxn]; inline void solve(void) { int i,j,k,tot1=0,tot2=0,cnt=0,ans1=0,ans2=0; read(n);read(m1);read(m2); for (i=1;i*i<=m1;i++) if (m1%i==0) d1[++tot1]=i,d1[++tot1]=m1/i; for (i=1;i*i<=m2;i++) if (m2%i==0) d2[++tot2]=i,d2[++tot2]=m2/i; int now=m1,nums=0; for (i=2;i*i<=m1;i++) { if (now%i==0) { while (now%i==0) now/=i; prime[++nums]=i; } } if (now>1) prime[++nums]=now; now=m2; for (i=2;i*i<=m2;i++) { if (now%i==0) { while (now%i==0) now/=i; prime[++nums]=i; } } if (now>1) prime[++nums]=now; sort(prime+1,prime+1+nums); nums=unique(prime+1,prime+1+nums)-prime-1; for (i=1;i<=tot1;i++) for (j=1;j<=tot2;j++) a[++cnt]=d1[i]*d2[j]; sort(a+1,a+1+cnt); cnt=unique(a+1,a+1+cnt)-a-1; for (i=1;i<=cnt;i++) { if (a[i]<=n) dp[i]=a[i];else { dp[i]=0; for (j=1;j<=nums;j++) if (a[i]%prime[j]==0) dp[i]=max(dp[i],dp[lower_bound(a+1,a+1+cnt,a[i]/prime[j])-a]); } if (dp[i]&&a[i]/dp[i]<=n) ans1++,ans2^=(a[i]/dp[i]); } printf("%lld %lld\n",ans1,ans2); } signed main(void){ read(T);while (T--) solve(); return 0; }
|