定义S(n) 表示为所有小于n的约数之和。例如S(10) = 1 + 2 + 5 = 8 当我们看到题目中的数据保证时第一时间就会考虑到以x为奇数\偶数来分类。I.灵魂碎片的收集
题目大意:
现在给定一个数x,求是否有一个n满足S(n) = x。
(题目保证如果x为偶数,那么x-1或者x-3其中至少有一个为质数,若x为奇数,则没有限制)
解题思路:
哥德巴赫猜想:
代码实现:
# include<bits/stdc++.h>
using namespace std;
const int N = 5e6+10;
# define int long long
vector<int> e[N];
int a[N];
int f[N],sz[N];
int primes[N];//质数
int vis[N],minp[N],cnt;//minp 对x的最小质数
void init()
{
for(int i = 2; i < N; i ++ )
{
if(!vis[i]) primes[cnt ++ ] = i, minp[i] = i;
for(int j = 0; primes[j] * i < N; j ++ )
{
vis[primes[j] * i] = true;
minp[primes[j] * i] = primes[j];
if(i % primes[j] == 0) break;
}
}
}
signed main(){
init();
int tt;
cin>>tt;
while(tt--){
int n;
cin>>n;
if(n == 1) {
cout<<3<<endl;
continue;
}
if(n == 3) {
cout<<4<<endl;
continue;
}
if(n == 5||n==2){
cout<<-1<<endl;
continue;
}
if(n==6){
cout<<6<<endl;
continue;
}
if(n==7){
cout<<8<<endl;
continue;
}
if(!(n&1)){
if(!vis[n-1]) cout<<(n-1)*1ll*(n-1)<<endl;
else if(!vis[n-3]) cout<<2ll*(n-3)<<endl;
else cout<<-1<<endl;
}
else{
bool ok = false;
for(int i = 0;i < cnt;++i){
if(primes[i]<n-1&&(!vis[n-1-primes[i]])&&(n-1-primes[i]!=primes[i])){
int ans = primes[i]*(n-1-primes[i]);
cout<<ans<<endl;
ok = 1;
break;
}
}
if(!ok) cout<<-1<<endl;
}
}
return 0;
}