LA 3357 (递推 找规律) Pinary

n位不含前导零不含连续1的数共有fib(n)个,fib(n)为斐波那契数列。

所以可以预处理一下fib的前缀和,查找一下第n个数是k位数,然后再递归计算它是第k位数里的多少位。

举个例子,比如说要找第11个数,发现它是个5位数,所以最高位是个1,然后它还是5位数里的第4个数。

这时要找第三个数了,因为后面的数允许有前导零,第三个数是100,所以第5位是1,第4位是0,后面三位是100,

答案就是10100

说的有点啰嗦,在纸上模拟一下还是很容易理解的。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 typedef long long LL;
 7
 8 const int maxf = 90000000 + 5;
 9 const int maxn = 50;
10
11 LL fib[maxn], sum[maxn];
12 int ans[100], p = 0;
13
14 void f(int n)
15 {
16     if(n == 0) return;
17     int digits = lower_bound(sum+1, sum+p, n) - sum;
18     ans[digits-1] = 1;
19     n -= sum[digits-1];
20     n--;
21     f(n);
22 }
23
24 int main()
25 {
26     int T, n; scanf("%d", &T);
27
28     fib[1] = fib[2] = 1;
29     for(p = 3; fib[p-1] < maxf; p++) fib[p] = fib[p-1] + fib[p-2];
30     sum[1] = fib[1];
31     for(int i = 2; i < p; i++) sum[i] = sum[i-1] + fib[i];
32
33     while(T--)
34     {
35         scanf("%d", &n);
36         memset(ans, 0, sizeof(ans));
37         int d = lower_bound(sum+1, sum+p, n) - sum;
38         f(n);
39         for(int i = d-1; i >= 0; i--) printf("%d", ans[i]);
40         printf("\n");
41     }
42
43     return 0;
44 }

代码君

时间: 2024-10-31 00:06:00

LA 3357 (递推 找规律) Pinary的相关文章

【数学题-递推找规律】BNU 4225 杨辉三角形

[题目链接]click here~~ [题目大意] LZM同学比较牛,Lsy最近也越来越生猛,他们思路快,代码速度神勇.近期惊闻此二人均要参加校赛,队里决定出些题目卡他们,因为他们的罢工给题目组留下了繁重的负担--(报复报复) 于是,XsugarX瞄准了LZM不太喜欢看的数学题目以及Lsy猜公式的喜好,奸笑中(^.^).这个数学问题是个比较古老的问题,有如下图的三角形被称为杨辉三角形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 我们记第一个1为第0行

BZOJ 3884(上帝与集合的正确用法-欧拉函数递推找极限)[Template:数论 V2]

3884: 上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 523  Solved: 237 [Submit][Status][Discuss] Description 根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做"元". 第二天, 上帝创造了一个新的元素,称作"α"."α"被定义为"元"构成的集合.容

HDU 2045 LELE的RPG难题(递推)

不容易系列之(3)—— LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 16913    Accepted Submission(s): 6742 Problem Description 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过

递推+高精度+找规律 UVA 10254 The Priest Mathematician

题目传送门 1 /* 2 题意:汉诺塔问题变形,多了第四个盘子可以放前k个塔,然后n-k个是经典的汉诺塔问题,问最少操作次数 3 递推+高精度+找规律:f[k]表示前k放在第四个盘子,g[n-k]表示经典三个盘子,2 ^ (n - k) - 1 4 所以f[n] = min (f[k] * 2 + g[n-k]),n<=10000,所要要用高精度,另外打表能看出规律 5 */ 6 /************************************************ 7 * Auth

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

Find 找规律,递推

Find Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatus Problem Description 给出Nfor(i = 1; i <= N; i ++) a[i] = i;solve(n,a[]) {     if(n == 1) return;    将奇数下标的数赋给a1,假设有len1个    将偶数下标的数赋给a2,len2个    solve(le

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

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

【找规律】【递推】【二项式定理】Codeforces Round #419 (Div. 1) B. Karen and Test

打个表出来看看,其实很明显. 推荐打这俩组 11 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000 12 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000 100000000000 打出表来看出来,n为偶数时,每隔两行,对原序列的奇数项分配的权重形成二项展开式. n为奇数时,每隔四行,形成二

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