题目链接 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. C++:100阶乘数组输出

    #include <iostream> using namespace std; int main(){ int i =1; int a[2048]={0}; while(i !=101) ...

  2. GoF23种设计模式之结构型模式之享元模式

    一.概述  运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...

  3. 多进程 multiprocessing 多线程Threading 线程池和进程池concurrent.futures

    multiprocessing.procsess 定义一个函数 def func():pass 在if __name__=="__main__":中实例化 p = process( ...

  4. Django之cookie、session

    会话跟踪技术 可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应. 一次会话过程中,我们应该注意的是什么呢? 那就是,一些操作要保证用户操作的是用户自己个人的数据.举个 ...

  5. LeetCode(268) Missing Number

    题目 Given an array containing n distinct numbers taken from 0, 1, 2, -, n, find the one that is missi ...

  6. PTA 7-2 符号配对

    直接用栈模拟即可,数组可做,但因为这节数据结构是栈,为了期末考试还是手写一下栈的操作,值得注意的是,这道题用gets函数在PTA上会编译错误,用scanf("%[^\n]", st ...

  7. Git命令大总结(纯手办)

    Git完整命令手册地址:http://git-scm.com/docs PDF版命令手册地址:github-git-cheat-sheet.pdf 1.git config -l查看全局用户信息配置 ...

  8. 第4章--变量,作用域和内存问题 jquery

    4.1基本类型和引用类型的值 解析器要分析赋给变量的值是基本类型值还是引用类型的值 基本类型:undefined   null   boolean   number    string 引用类型的值: ...

  9. Spring事务支持:利用继承简化配置

    因为事务代理的实现类是 TransactionProxyFactoryBean . 事务代理Bean必须注入事务管理器. 大部分情况下,每个事务代理的事务属性大同小异,对于这种情况,Spring提供了 ...

  10. java EE技术体系——CLF平台API开发注意事项(1)——后端开发

    前言:这是一篇帮助小伙伴在本次项目中快速进入到java EE开发的一些说明,为了让同组小伙伴们开发的时候,有个清晰点的思路.昨天给大家演示分享了基本概况,但没有留下文字总结说明,预防后期有人再次问我, ...