Description
给定一个正整数 �n,设 �=�1×�2×…��n=p1×p2×…pk,其中 ��pi 均为质数,对 1≤�<�1≤i<k,��≤��+1pi≤pi+1。
可以证明,序列 ��pi 是唯一的。
对每个给定的 �n,请你求出 �1,�2,…��p1,p2,…pk。
为了避免输出过大,请你输出 �1,�2,…��p1,p2,…pk 的按位异或和。
Input
本题单测试点内有多组测试数据。
第一行是一个整数,表示测试数据组数 �T。
接下来 �T 行,每行一个整数,表示一组数据的 �n。
Output
对每组测试数据,输出一行一个整数,表示它所有质因子的按位异或和。
Sample 1
Inputcopy | Outputcopy |
---|---|
2 3 9 | 3 0 |
Hint
数据规模与约定
对于全部的测试点,保证 1≤�≤1061≤T≤106,2≤�≤1082≤n≤108。
提示
请注意大量数据读入输出对程序效率造成的影响,选择合适的 IO 方式,避免超时。
#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<deque>
#include<map>
#define endl '\n'
#define ll long long
//#define int ll
using namespace std;
const int N=1e8+7;
int a[N],p[N],sum[N];
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int cnt=0;
for(int i=2;i<N;i++)
{
if(!a[i]) p[++cnt]=i;
for(int j=1;j<=cnt&&(ll)p[j]*i<N;j++)
{
a[p[j]*i]=p[j];
if(!i%p[j]) break;
}
}
int t;
cin>>t;
while(t--)
{
int n;
int ans=0;
cin>>n;
if(a[n]==0)
{
cout<<n<<endl;
continue;
}
else
{
while(1)
{
if(!a[n])
{
ans^=n;
break;
}
ans^=a[n];
n/=a[n];
}
cout<<ans<<endl;
}
}
return 0;
}