石头

37 篇文章 1 订阅

石头

这 题 我 没 想 到 ( 连 正 解 的 边 都 没 挨 上 ) , 所 以 直 接 复 述 题 解 这题我没想到(连正解的边都没挨上),所以直接复述题解 ()

首 先 发 现 n 太 大 , 所 以 我 们 要 想 办 法 找 到 一 些 答 案 的 限 制 首先发现n太大,所以我们要想办法找到一些答案的限制 n

然 后 我 们 发 现 3 ∗ n 2 − 3 ∗ n + 1 = 6 ∗ ( n 2 ) + 1 然后我们发现3*n^2-3*n+1=6*\tbinom{n}{2}+1 3n23n+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<=8N3N86nx+3x353

又 发 现 3 ∗ n 2 − 3 ∗ n + 1 m o d    6 = 1 又发现3*n^2-3*n+1\mod{ 6}=1 3n23n+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");
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值