题目链接 https://nanti.jisuanke.com/t/38222

题意:

定义函数:

$$F(n)=\left\{
\begin{aligned}
1, \quad n=1,2 \\
F(n-1)+F(n-2),\quad n\geq3 \quad
\end{aligned}
\right.
$$

给定一个W 找到一个字典序最小的集合S使得

$$W=\sum_{f\in S}F(F(f))$$

$1\leq  T\leq 10$

$1\leq  W\leq 10^{100,000}$

解析:java大数打表可以发现 当f >28时已经超过W上界了,所以快速幂求出来前28项就好了,数增加的非常快,只有当W<=10时才有 多个解的情况

所以从大的开始减,当减到第五项的时候 再分类讨论一下就好了。

AC代码

import java.util.*;
import java.math.*; public class Main { static class Matrix {
public static int maxn = ;
BigInteger a[][] = new BigInteger [maxn][maxn];
public void init() {
for (int i = ; i < maxn; ++i) for (int j = ; j < maxn; ++j) a[i][j] = BigInteger.ZERO;
}
public void _init() {
init();
for (int i = ; i < maxn; ++i) a[i][i] = BigInteger.ONE;
}
public static Matrix mul(Matrix A, Matrix B) {
Matrix res = new Matrix();
res.init();
for (int i = ; i < maxn; ++i) {
for (int j = ; j < maxn; ++j) {
for (int k = ; k < maxn; ++k) {
res.a[i][k] = res.a[i][k].add(A.a[i][j].multiply(B.a[j][k]));
}
}
}
return res;
}
public static Matrix q_pow(Matrix A, BigInteger k) {
Matrix res = new Matrix();
res._init();
while(k.compareTo(BigInteger.ZERO) > ) {
if(k.mod(BigInteger.valueOf()).compareTo(BigInteger.ZERO) > ) res = mul(res, A);
A = mul(A, A);
k = k.shiftRight();
}
return res;
}
}
public static BigInteger get_fib(BigInteger n) {
if(n.compareTo(BigInteger.ONE) == ) return BigInteger.ONE;
if(n.compareTo(BigInteger.valueOf()) == ) return BigInteger.ONE;
Matrix A = new Matrix();
A.a[][] = BigInteger.ZERO;
A.a[][] = A.a[][] = A.a[][] = BigInteger.ONE;
A = Matrix.q_pow(A, n.subtract(BigInteger.valueOf()));
return A.a[][].add(A.a[][]);
} public static void main(String[] args) { BigInteger f[] = new BigInteger[];
int ans[] = new int[];
Scanner cin = new Scanner(System.in);
int T = cin.nextInt();
for (int i = ; i <= ; ++i) {
f[i] = Main.get_fib(Main.get_fib(BigInteger.valueOf(i)));
}
while(T--> ) {
BigInteger W = cin.nextBigInteger();
int cnt = ;
for (int i = ; i >= ; --i) {
if(f[i].compareTo(W) <= ) {
ans[++cnt] = i;
W = W.subtract(f[i]);
}
}
if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ){
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.valueOf()) == ) {
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
ans[++cnt] = ;
}
else if(W.compareTo(BigInteger.ZERO)!=){
System.out.println(-);
continue;
}
for (int i = cnt; i >= ; --i) {
if(i == )
System.out.println(ans[i]);
else
System.out.print(ans[i]+" ");
}
}
} }

代码参考 https://www.cnblogs.com/widsom/p/10742707.html

2019南昌邀请赛 C. Angry FFF Party 大数矩阵快速幂+分类讨论的更多相关文章

  1. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

  2. 2019南昌邀请赛网络预选赛 M. Subsequence

    传送门 题意: 给出一个只包含小写字母的串 s 和n 个串t,判断t[i]是否为串 s 的子序列: 如果是,输出"YES",反之,输出"NO": 坑点: 二分一 ...

  3. BNUOJ 34985 Elegant String 2014北京邀请赛E题 矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 题目大意:问n长度的串用0~k的数字去填,有多少个串保证任意子串中不包含0~k的 ...

  4. 2019南昌邀请赛网络预选赛 I. Max answer(单调栈+暴力??)

    传送门 题意: 给你你一序列 a,共 n 个元素,求最大的F(l,r): F(l,r) = (a[l]+a[l+1]+.....+a[r])*min(l,r); ([l,r]的区间和*区间最小值,F( ...

  5. 2019南昌邀请赛网络预选赛 J.Distance on the tree(树链剖分)

    传送门 题意: 给出一棵树,每条边都有权值: 给出 m 次询问,每次询问有三个参数 u,v,w ,求节点 u 与节点 v 之间权值 ≤ w 的路径个数: 题解: 昨天再打比赛的时候,中途,凯少和我说, ...

  6. POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum

    http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...

  7. 2019南昌邀请赛 L 计算几何 G(待补)

    #include<bits/stdc++.h> const double PI=acos(-1.0); ; using namespace std; struct Point { doub ...

  8. 2019南昌邀请赛网络赛:J distance on the tree

    1000ms 262144K   DSM(Data Structure Master) once learned about tree when he was preparing for NOIP(N ...

  9. [2019南昌邀请赛网络赛D][dp]

    https://nanti.jisuanke.com/t/38223 Xiao Ming recently indulges in match stick game and he thinks he ...

随机推荐

  1. FastJsonUtils工具类

    fastjson是由alibaba开源的一套json处理器.与其他json处理器(如Gson,Jackson等)和其他的Java对象序列化反序列化方式相比,有比较明显的性能优势. 版权声明:本文为博主 ...

  2. 【整理】虚拟机和主机ping不通解决办法,虚拟机ping不通外网的解决方法

     检查几个方面: 1.检查虚拟网卡有没有被禁用2.检查虚拟机与物理机是否在一个VMNet中3.检查虚拟机的IP地址与物理机对应的VMNet是否在一个网段4.检查虚拟机与物理机的防火墙是否允许PING, ...

  3. 消息中间件ActiveMQ及Spring整合JMS

    一 .消息中间件的基本介绍 1.1 消息中间件 1.1.1 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排 ...

  4. Decorator——Python初级函数装饰器

    最近想整一整数据分析,在看一本关于数据分析的书中提到了(1)if __name__ == '__main__' (2)列表解析式 (3)装饰器. 先简单描述一下前两点,再详细解说Python初级的函数 ...

  5. nrf开发笔记一开发软件

    nrf52810 的开发环境,比较主流的可以使用keil,iar亦可.sdk中,使用的是pca10040e,s112.虽然开发板共用一个型号(pca10040) keil5中,cmsis 需要4.5. ...

  6. Artwork Gym - 101550A 离线并查集

    题目:题目链接 思路:每个空白区域当作一个并查集,因为正着使用并查集分割的话dfs会爆栈,判断过于复杂也会导致超时,我们采用离线反向操作,先全部涂好,然后把黑格子逐步涂白,我们把每个空白区域当作一个并 ...

  7. kettle-单表增量同步

    目标:利于kettle实现单表增量同步,以时间为判断条件 背景:源表:db1.q1 (2w条数据) 目标表:db2.q2(0条数据) 表结构: CREATE TABLE `q1` (  `ID` bi ...

  8. ASP.Net 更新页面输出缓存的几种方法

    ASP.Net 自带的缓存机制对于提高页面性能有至关重要的作用,另一方面,缓存的使用也会造成信息更新的延迟.如何快速更新缓存数据,有时成了困扰程序员的难题.根据我的使用经验,总结了下面几种方法,概括了 ...

  9. 流式处理框架storm浅析(上篇)

    本文来自网易云社区 作者:汪建伟 前言 前一段时间参与哨兵流式监控功能设计,调研了两个可以做流式计算的框架:storm和spark streaming,我负责storm的调研工作.断断续续花了一周的时 ...

  10. iOS学习笔记49-Swift(九)访问控制

    一.Swift的访问控制 Swift中的访问控制模型基于模块和源文件这两个概念 模块指的是Framework或App bundle.在Swift中,可以用import关键字引入自己的工程. 源文件指的 ...