HYJ37567 @ 2024-10-05 16:35:00
防空洞
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求调
by HYJ37567 @ 2024-10-05 16:35:29
错了1个测试点
by wintorsd @ 2024-10-06 16:32:55
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
ll T,n,ans,anf,ant;
int main(){
cin>>T;
while(T--){
ans=1e18;
scanf("%lld",&n);
n%=MOD;
for(int i=0;i<=2;i++){
anf=i;
ant=n;
for(int j=1;j<=i;j++){
ant=(ant*4+3)%MOD;
}
while(ant!=0&&anf<100000){
ant=(ant*8+7)%MOD;
anf++;
}
if(ant==0)ans=min(ans,anf);
}
if(ans==1e18)puts("-1");
else printf("%lld\n",ans);
}
return 0;
}
/*
5
1000000007
1000000006
1000000006
1000000006
1000000006
*/