这 题 我 没 想 到 ( 连 正 解 的 边 都 没 挨 上 ) , 所 以 直 接 复 述 题 解 这题我没想到(连正解的边都没挨上),所以直接复述题解 这题我没想到(连正解的边都没挨上),所以直接复述题解
首 先 发 现 n 太 大 , 所 以 我 们 要 想 办 法 找 到 一 些 答 案 的 限 制 首先发现n太大,所以我们要想办法找到一些答案的限制 首先发现n太大,所以我们要想办法找到一些答案的限制
然 后 我 们 发 现 3 ∗ n 2 − 3 ∗ n + 1 = 6 ∗ ( n 2 ) + 1 然后我们发现3*n^2-3*n+1=6*\tbinom{n}{2}+1 然后我们发现3∗n2−3∗n+1=6∗(2n)+1
任意一个正整数都能写成三个n*(n-1)/2的和
题 解 也 没 给 证 明 , 但 发 现 还 是 挺 好 理 解 的 , 至 于 怎 么 证 还 是 看 百 度 吧 题解也没给证明,但发现还是挺好理解的,至于怎么证还是看百度吧 题解也没给证明,但发现还是挺好理解的,至于怎么证还是看百度吧
然 后 很 容 易 证 明 a n s < = 8 , 因 为 N − 3 到 N − 8 里 一 定 有 一 个 6 的 倍 数 ( 不 妨 设 为 n − x + 3 ) , 剩 下 的 即 为 x − 3 个 , 最 大 为 5 , 所 以 一 定 小 于 等 于 3 然后很容易证明ans<=8,因为N-3到N-8里一定有一个6的倍数(不妨设为n-x+3),剩下的即为x-3个,最大为5,所以一定小于等于3 然后很容易证明ans<=8,因为N−3到N−8里一定有一个6的倍数(不妨设为n−x+3),剩下的即为x−3个,最大为5,所以一定小于等于3
又
发
现
3
∗
n
2
−
3
∗
n
+
1
m
o
d
6
=
1
又发现3*n^2-3*n+1\mod{ 6}=1
又发现3∗n2−3∗n+1mod6=1
所
以
n
m
o
d
6
=
a
n
s
所以n\mod{6}=ans
所以nmod6=ans
然后·就很好处理了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%lld",&n);
if((n%6)>2){
printf("%lld\n",(n%6));
continue;
}
if(n%6==0){
puts("6");
continue;
}
if(n%6==1){
ll tmp=sqrt(12*n-3);
ll tp1=tmp*tmp;
if(tp1!=12*n-3){
puts("7");
continue;
}
if((tmp+3)%6!=0){
puts("7");
continue;
}
puts("1");
continue;
}
if(n%6==2){
ll up=sqrt(n*10);
bool flag=false;
for(ll i=1;i<=up;i++){
ll tpp=n-3*i*i+3*i-2;
ll tmp2=sqrt(9+12*tpp);
if(tmp2*tmp2!=(9+12*tpp)){
continue;
}
ll tmp3=(3+tmp2)%6;
if(tmp3){
continue;
}
flag=true;
break;
}
if(flag){
puts("2");
}
else puts("8");
}
}
}