洛谷 P1635 跳跃
题目:
题目背景
NOIP即将迎来周年华诞。在这一个春秋的历程里,NOIP领导全国oier,建设高效、稳定、快捷、开放的社会主义现代化OI。在新的一年里,YZOJ将再接再厉,积极探寻成长之路,更好地为广大oier服务。
题目描述
青蛙小C听说NOIP要办周年庆比赛,兴冲冲得来到了Z市,初始时他在坐标x0处,小C是一只善于跳跃的青蛙,若当前他处在坐标x处,每一次跳跃,他可以跳到4x+34x+34x+3或8x+78x+78x+7处,且由于体力原因,他最多能跳100000100000100000次。根据Z市的传说,坐标位置为100000000710000000071000000007的整数倍的位置(如100000000710000000071000000007、200000001420000000142000000014)可以传送到YZOJ。小C想知道,最少跳几次能传送到YZOJ。
输入输出格式
输入格式:
输入的第一行包含一个整数x0表示青蛙的初始位置,保证x0在的范围在[1,1000000006][1,1000000006][1,1000000006]。
输出格式:
输出一个整数,表示最少所需步数,若在100000100000100000步内还无法传送到YZOJYZOJYZOJ,则输出−1-1−1。
分析:
显然,这一看就是一道数学题
那么我们怎么考虑呢?
如果你细心一点就会发现:
4x+3=2∗(2x+1)+14x+3=2*(2x+1)+14x+3=2∗(2x+1)+1
8x+7=2∗(2∗(2x+1)+1)+18x+7=2*(2*(2x+1)+1)+18x+7=2∗(2∗(2x+1)+1)+1
那么不就是说,只需要计算与2x+1有关的步数,然后推导普遍规律就行。
计算有几次2x+1的过程太简单,等会直接看代码就行。下面分析处理结果的方法。
再跳回两个式子:
4x+3=2∗(2x+1)+14x+3=2*(2x+1)+14x+3=2∗(2x+1)+1
8x+7=2∗(2∗(2x+1)+1)+18x+7=2*(2*(2x+1)+1)+18x+7=2∗(2∗(2x+1)+1)+1
我们可以发现:最多的是由三个2x+1等构成(即8x+7),所以我们不妨考虑将结果先mod 3:
%3=03=03=0:那么就是一堆8x+78x+78x+7(设为n个),输出answer/3;answer/3;answer/3;
%3=13=13=1:可以想成把本来的nnn个8x+78x+78x+7从整好的多了一个2x+12x+12x+1,所以只能拆出一个2x+12x+12x+1,变成n−1n-1n−1个8x+78x+78x+7和222个4x+34x+34x+3.
%3=23=23=2:可以想成把本来的n个8x+78x+78x+7从整好的多了两个2x+12x+12x+1,所以n个8x+78x+78x+7不用变,只是把多出的两个2x+12x+12x+1合成一个4x+34x+34x+3就行。
对了补充一句,因为首先是给出x,然后才能变成2x+1,4x+3,8x+7 . 等。所以所谓的三步其实是算上x变成2x+1的QAQ
然后归纳一下就行了,具体看代码:
#include<cstdio>
using namespace std;
const int mod=1000000007;//定义mod
int ans;
int search(int x)//递归部分,AC
{
if(ans>=300100)//由于每次递归做的次数都很少,所以可以多做几次,避免误差
{
printf("-1");
return 0;
}
int y=((x%mod)*2+1)%mod;
ans++;
if(y==0)//等于0就是达成了整数倍
{//接下来就是归纳刚刚分析的内容,中间要判断答案是否在100000以内
if(ans%3==0)
{
if(ans/3>100000)
{
printf("-1");
return 0;
}
printf("%d",ans/3);
return 0;
}
else
{
if(ans/3+1>100000)
{
printf("-1");
return 0;
}
printf("%d",ans/3+1);
return 0;
}
}
else
search(y);//继续走
return 0;
}
int main()
{
long long m;
scanf("%lld",&m);
/*while(ans<=300000)//非递归部分,暂时没有AC
{
m=m*2+1;
ans++;
if(m%1000000007==0)
{
if(ans>100000)
{
printf("-1\n");
}
if(ans%3==0)
printf("%d",ans/3);
else
{
printf("%d",ans/3+1);
}
return 0;
}
}
printf("-1\n"); */
search(m);
return 0;
}
洛谷 P1635 跳跃的更多相关文章
- 洛谷 P2678 跳石头
题目背景 一年一度的"跳石头"比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间 ...
- [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)
[NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...
- 【洛谷】P1052 过河【DP+路径压缩】
P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙 ...
- 洛谷3763:[TJOI2017]DNA——题解
https://www.luogu.org/problemnew/show/P3763 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是 ...
- 洛谷 P2261 [CQOI2007]余数求和
洛谷 一看就知道是一个数学题.嘿嘿- 讲讲各种分的做法吧. 30分做法:不知道,这大概是这题的难点吧! 60分做法: 一是直接暴力,看下代码吧- #include <bits/stdc++.h& ...
- DP【洛谷P3089】 [USACO13NOV]POGO的牛Pogo-Cow
[洛谷P3089] [USACO13NOV]POGO的牛Pogo-Cow FJ给奶牛贝西的脚安装上了弹簧,使它可以在农场里快速地跳跃,但是它还没有学会如何降低速度. FJ觉得让贝西在一条直线的一维线路 ...
- 洛谷P1107 & BZOJ1270 [BJWC2008]雷涛的小猫
一道DP. 给你一个矩阵里面有很多数,你需要从上往下找到一种跳跃方法使得经过的点的价值之和最大. 具体题面见链接 洛谷P1107 BZOJ1270 很明显是一个二维的DP. #include<b ...
- 洛谷 1052 dp 状态压缩
洛谷1052 dp 状态压缩 传送门 (https://www.luogu.org/problem/show?pid=1052#sub) 做完这道题之后,感觉涨了好多见识,以前做的好多状压题目都是将一 ...
- 洛谷 P2504 [HAOI2006]聪明的猴子
洛谷 P2504 [HAOI2006]聪明的猴子 题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水 ...
随机推荐
- vista忘记用户名密码的修改方法(使用PE进入系统,用cmd.exe冒充虚拟键盘,然后就可以mmc组策略,或者命令行添加用户并提升权限)
1. 准备Windows Vista安装光盘,进入BIOS将光驱设为第一启动,在出现的安装界面依次单击"修复计算机","命令提示符". 2.输入以下命令: co ...
- Android卡片设置透明度失效问题
最近在做蓝牙电话项目,需要支持双路通话,涉及到通话卡片透明度调节,当正在通话中,有新的来电时,原来的通话卡片需要做成30%的透明度,本来很简单的一个小改进,但通过 setAlpha()接口总是失效! ...
- Delphi使用TObject类对象创建接受window消息(使用Classes.AllocateHWnd为对象创建一个尺寸为0的窗口,从而有了Handle)good
在delphi中,有时候我们希望对象可以接收windows消息,怎么办呢?因为要接收windows消息起码要有windows Handle,难道要建立的一个可见窗口?那样似乎太差强人意了.delphi ...
- Qt之界面数据存储与获取(userData)
http://blog.csdn.net/u011012932/article/details/52413012#comments
- java关键字之synchronized
1.synchronized可以用了修饰一个普通方法,或者代码块,这个时候synchronized锁定的是当前对象,只要有一个线程在访问对应的方法或代码块,其他线程必须等待.2.synchronize ...
- shell多线程(3)while循环
start="2018-06-17" end="2018-07-01" min=`date -d "${start}" +%Y%m%d` m ...
- 《JavaScript 高级程序设计》读书笔记
文章目录 第三章 基本语法 第四章 变量.作用域和内存问题 第五章 应用类型 1. Array 类型 2. RegExp 类型 3. Function 类型 4. String 类型 第六章 面向对象 ...
- string类总结第二部分实战练习
第二部门:实战练习 昨天由于时间原因,这个部分应该在同一个文章中的,无奈只能今天再开一个了,今天主要是讲一些面试题 一:equals和==的区别 最简单的面试题,也是最基础的,我估计每个学习java的 ...
- Fish and Oh My Fish in Ubuntu
After install Fish shell, then install Oh My Fish . Oh My Fish(shortly OMF) can make our Fish shell ...
- vim配置轻量级IDE
安装VIM 安装YouCompleteMe的时候, 需要VIM的版本比较高, 一般一些Linux长期支持版的Vim包就比较老, 所以可能需要编译安装. 卸载之前系统中安装的版本: CentOS/Fed ...