站外题求助

学术版

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
*/

|