Find 找规律,递推

Find

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)

SubmitStatus

Problem Description

给出N
for(i = 1; i <= N; i ++) a[i] = i;
solve(n,a[]) {
     if(n == 1) return;
    将奇数下标的数赋给a1,假设有len1个
    将偶数下标的数赋给a2,len2个
    solve(len1,a1)
    solve(len2,a2)
    for(int i = 1; i <= len1; i ++) a[i] = a1[i];
    for(int i = 1; i <= len2; i ++) a[i + len1] = a2[i];
}

给出M个查询,1. 查询执行完solve的数组a中第i个数是什么,2. 查询原数组a中第i个数现在的位置

Input

多组数据

对于每组数据,第一行N,M(1 <= N <= 10^18, 1 <= M <= 10^5)

接下来M行,每行两个数x,y (1 <= x <= 2, 1 <= y <= n)

x = 1,查询执行完solve的数组a中第i个数是什么

x = 2, 查询原数组a中第i个数现在的位置

Output

每个查询输出一行,你的答案

Sample Input

4 2
1 2
2 4
6 4
1 1
1 5
1 3
2 4

Sample Output

3
4
1
6
3
6

Hint

例子N = 4,{1,2,3,4} -> {1,3} + {2,4} = {1,3,2,4}
N = 6,{1,2,3,4,5,6}-> {1,3,5} + {2,4,6} = {1,5} + {3} + {2,6} + {4} = {1,5,3,2,6,4}

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <string.h>
 5 #include <algorithm>
 6 using namespace std;
 7 #define ll long long
 8 ll fun2(ll y,ll n)
 9 {
10     if(y==1)
11     return 1;
12     if(y&1)
13     {
14         return fun2(((y>>1)+1),((n+1)>>1));
15     }
16     else
17     {
18         return ((n+1)>>1)+fun2(y>>1,n>>1);
19     }
20 }
21 ll fun1(ll y,ll n)
22 {
23     if(y==1)
24     return 1;
25     ll m=(n+1)>>1;
26     if(y<=m)
27     {
28         return (fun1(y,m)<<1)-1;
29     }
30     else
31     {
32        return  (fun1(y-m,n>>1)<<1);
33     }
34 }
35 int main()
36 {
37     ll n,x,y,ans;
38     int m,i,j;
39     while(scanf("%lld%d",&n,&m)!=EOF)
40     {
41         for(i=0;i<m;i++)
42         {
43             scanf("%lld%lld",&x,&y);
44             if(x==1)
45             {
46                printf("%lld\n",fun1(y,n));
47             }
48             else
49             {
50                 printf("%lld\n",fun2(y,n));
51             }
52         }
53     }
54     return 0;
55 }

Find 找规律,递推

时间: 2024-08-25 15:33:07

Find 找规律,递推的相关文章

51nod 1350 斐波那契表示 (找规律递推)

分析: - -! 找规律...首先可以归纳证明,对于n,最佳的取法是先取不大于n的最大的那个斐波那契数,然后递推.从而可以得到算出F(n)的一个方法,但是n的范围太大了,先算出n较小的情况,会发现: 第三列为F(n),第二列为G(n),可以看出第k块是由k-1块和k-2块+1合在一起得到的,从而可以先预处理前k块之和(k不会超过100),然后对于每个n,先找到最大的不超过n的那块,然后对剩下的项递归,总的复杂度为O(T*logn). 1 #include<iostream> 2 #includ

1002. [FJOI2007]轮状病毒【找规律+递推】

Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规律是在一个N轮状基中删去若干条边,使得各原子之间有唯一的信息通道,例如共有16个不 同的3轮状病毒,如下图所示 现给定n(N<=100),编程计算有多少个不同的n轮状病毒 Input 第一行有1个正整数n Output 计算出的不同的n轮状病毒数输出 Sample Inpu

2018南京区域赛G题 Pyramid——找规律&amp;&amp;递推

先手动推出前10项,再上BM板子求出递推式 $A_n = 5A_{n-1} - 10A_{n-2} + 10A_{n-3} - 5A_{n-4} + A_{n-5}$,根据特征根理论可求出特征方程 $(x-1)^5$,设 $A_n = k_1n^4 + k_2n^3 + k_3n^2+k_4n+k_5$,代入前5项求出系数(用了高斯消元法解方程组). 这样虽然做出来了,但是感觉比较浪费时间,因为BM板子和高斯消元法的板子都不短,对手残狗不友好. 差分 首先前7项分别为1  5 15 35 70

踩方格(找规律 递推)

踩方格 时间限制: 1 Sec  内存限制: 128 MB提交: 8  解决: 7[提交][状态][讨论版][命题人:quanxing] 题目描述 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设: a.每走一步时,只能从当前方格移动一格,走到某个相邻的方格上: b.走过的格子立即塌陷无法再走第二次: c.只能向北.东.西三个方向走: 请问:如果允许在方格矩阵上走n步,共有多少种不同的方案.2种走法只要有一步不一样,即被认为是不同的方案. 输入 允许在方格上行走的步数n(n≤20). 输出 计

POJ 2229 sumset ( 完全背包 || 规律递推DP )

题意 : 给出一个数 n ,问如果使用不同 2 的幂的和来组成这个数 n 有多少种不同的方案? 分析 :  完全背包解法 将问题抽象==>有重量分别为 2^0.2^1.2^2-2^k 的物品且每种物品可无限取,问有多少种方案来填满容量为 n 的背包? 之前并不知道背包还能用来计数....... 有一道裸的背包计数问题可以作为练习 ==> HDU 1284 定义 dp[ i ][ j ] 为前 i 种物品组成总重量 j 的方案数为多少.初始化为 dp[ 0 ][ 0 ] = 1 其他为 0 则状

ZOJ3629 Treasure Hunt IV(找规律,推公式)

Treasure Hunt IV Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is exploring the wonderland, suddenly she fell into a hole, when she woke up, she found there are b - a + 1 treasures labled a from b in front of her. Alice was very excited but

UVa11040 - Add bricks in the wall (规律递推)

找规律的题 [x] [a][x-a] [y] [    ][z] 这里面xyz都已知,所以可以求出a = (x + y - z ) /2 #include<cstdio> int a[9][9]; int main() { int t; scanf("%d",&t); while(t--){ for(int i=0;i<9;i+=2) for(int j=0;j<=i;j+=2) scanf("%d",&a[i][j]); f

hdu1165 规律递推

题意:给了公式,求A(m,n). 并不知道为什么被杭电分类塞进了dp专题,但是我一开始显然看到这个题就觉得给那个公式用函数递归一下答案肯定能出来了,只不过既然放在了dp专题里面估计这样暴力求解会TLE的吧(是的当时我还天真的以为真的是dp```),然后敲了一遍的确T了不出意料,但是在测试样例的时候我发现m=0 .1的时候好像都很有规律的样子(装毛线深沉,就是每次加一嘛```)然后我就用刚才T的程序打了一部分表```然后规律就出来了```然后就按规律重敲了一下,然后```然后```然后```你们以

ACM_递推题目系列之一涂色问题

递推题目系列之一涂色问题 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有排成一行的n个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法. Input: 输入数据包含多个测试实例,每个测试实例占一行,由一个整数N组成,(0<n<=50). Output: 对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行

递推专题笔记

递推说白了就是找规律,然后写出他的递推方程,有的还可以写出通项公式,然后准确预测出第n项的值.因为这种规律存在着前因后果的关系,即是说,后一项的结果往往和前一项或前几项有着某种联系.这种联系不仅仅存在于数字之中,世间万物亦是如此. 由于,递推是深入理解动态规划的基础,就我目前的水平,看到动态规划就如看到tiger一般,完全不知所以,所以为了找回在动态规划前的自信,我打算在回家之前,找一个递推专题练练手.现记录如下: 心得: 1. 既然是递推题,那么肯定有递推方程,那么同样有规律可循,既然有规律.