CF1622F Quadratic Set
观察到答案的下界为 ,
证明:
若 为偶数,令
- 当 为偶数时,删去 即可
- 当 为奇数时,删去 即可
若 为奇数,删去 转化为偶数的情况,最多删去 个数。
注意上述构造不一定是最优的,需要依次判断。
最后一个问题,如何快速判断一个数是否为完全平方数?
考虑异或哈希,将每一个质数 随机赋权 ,并规定
那么 为完全平方数
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define pii pair< int , int >
#define fi first
#define sc second
#define mp make_pair
ull rd( ) {
return ( rand() + 0llu ) | ( ( rand() + 0llu ) << 16llu ) | ( ( rand() + 0llu ) << 32llu ) | ( ( rand() + 0llu ) << 48llu );
}
const int MAXN = 1e6;
int prn , pri[ MAXN + 5 ]; bool vis[ MAXN + 5 ];
ull f[ MAXN + 5 ];
void sieve() {
f[ 1 ] = 0;
for( int i = 2 ; i <= MAXN ; i ++ ) {
if( !vis[ i ] ) pri[ ++ prn ] = i , f[ i ] = rd();
for( int j = 1 ; j <= prn && 1ll * i * pri[ j ] <= MAXN ; j ++ ) {
vis[ i * pri[ j ] ] = 1;
f[ i * pri[ j ] ] = f[ i ] ^ f[ pri[ j ] ];
if( i % pri[ j ] == 0 ) break;
}
}
for( int i = 1 ; i <= MAXN ; i ++ ) f[ i ] ^= f[ i - 1 ];
}
int n; ull hs;
unordered_map< ull , int > vish;
int main( ) {
srand( 123456 ); sieve();
scanf("%d",&n);
//n
for( int i = 1 ; i <= n ; i ++ ) hs ^= f[ i ];
if( hs == 0 ) {
printf("%d\n", n );
for( int i = 1 ; i <= n ; i ++ ) printf("%d ", i );
return 0;
}
//n-1
for( int i = 1 ; i <= n ; i ++ ) if( ( hs ^ f[ i ] ) == 0 ) {
printf("%d\n", n - 1 );
for( int j = 1 ; j <= n ; j ++ ) if( i != j ) printf("%d ", j );
return 0;
}
//n-2
for( int i = 1 ; i <= n ; i ++ ) {
if( vish[ f[ i ] ] ) {
printf("%d\n", n - 2 );
for( int j = 1 ; j <= n ; j ++ ) if( j != i && j != vish[ f[ i ] ] ) printf("%d ", j );
return 0;
}
vish[ hs ^ f[ i ] ] = i;
}
//n-3
assert( n & 1 );
printf("%d\n", n - 3 );
for( int i = 1 ; i <= n ; i ++ ) if( i != 2 && i != ( n - 1 ) / 2 && i != n ) printf("%d ", i );
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现