站外题求助
  • 板块学术版
  • 楼主HYJ37567
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/5 16:35
  • 上次更新2024/10/5 18:05:58
查看原帖
站外题求助
665533
HYJ37567楼主2024/10/5 16:35

防空洞

A国和B国在战争。你参与了这场战争,而且目前你被打败了。你需要找到最近的防空洞去藏身。 所有的防空洞都可以抽象成数轴的一个点,而且非常有规律,它们的位置是1000000007的倍数。 即第1个防空洞在整数0的位置,第2个防空洞在1000000007的位置,第3个防空洞在2000000014的位置......

你初始位置在整数点start。你身上安装了一种武器:“青蛙跳”,使得你只能进行“青蛙跳”的步伐。

“青蛙跳”是这样的:假设你当前位置在整数点a,那么一次“青蛙跳”使得你可以跳到整数点3+4 *a或整数点7+8 * a。 由于已经很疲惫了,所以你最多只能跳100000次“青蛙跳”。 问题是:你从整点start出发,最少需要多少次“青蛙跳”才能提跳进防空洞? 如果你跳了100000次"青蛙跳" 都还不能跳进防空洞,那么输出-1。
输入格式 多组测试数据。 第一行,一个整数G,表示有G组测试数据。 1 <= G <= 5

每组测试数据格式:

第一行,一个整数:start。 1<=start<=1000000006

输出格式 共G行,每行一个整数。

输入/输出例子1 输入:

5

4530664

18426114

974579565

281250001

125000000

输出:

478

58

-1

2

1

代码:

#include<bits/stdc++.h>
using namespace std;
long long g,n;
int main()
{
	scanf("%lld",&g);
	while(g--)
	{
		scanf("%lld",&n);
		long long t=0;
		while(t<300000&&n!=0)
		{
			t++;
			n=(n*2+1)%1000000007;
		}
		if(n!=0)
		{
			printf("-1\n");
		}
		else
		{
			if(t%3==0) printf("%lld\n",t/3);
			else if(t%3==2) printf("%lld\n",t/3+1);
			else printf("%lld\n",2+(t-4)/3);
		}
	}
	return 0;
}

92pts求调

2024/10/5 16:35
加载中...