hdu 6198 dfs枚举找规律+矩阵乘法

2024-09-09 06:48

本文主要是介绍hdu 6198 dfs枚举找规律+矩阵乘法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

number number number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)


Problem Description
We define a sequence  F :

  F0=0,F1=1 ;
  Fn=Fn1+Fn2 (n2) .

Give you an integer  k , if a positive number  n  can be expressed by
n=Fa1+Fa2+...+Fak  where  0a1a2ak , this positive number is  mjfgood . Otherwise, this positive number is  mjfbad .
Now, give you an integer  k , you task is to find the minimal positive  mjfbad  number.
The answer may be too large. Please print the answer modulo 998244353.

Input
There are about 500 test cases, end up with EOF.
Each test case includes an integer  k  which is described above. ( 1k109 )

Output
For each case, output the minimal  mjfbad  number mod 998244353.

Sample Input
  
1

Sample Output
  
4

Source
2017 ACM/ICPC Asia Regional Shenyang Online

线dfs枚举出前6项结果发现递推式,注意矩阵中有负数。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.StringTokenizer;public class Main {public static void main(String[] args) {new Task().solve();}
}class Task {InputReader in = new InputReader(System.in) ;PrintWriter out = new PrintWriter(System.out) ;/*    long[] fib = new long[25] ;{fib[1] = 0 ;fib[2] = 1 ;for(int i = 3 ; i < 25 ; i++){fib[i] = fib[i-1] + fib[i-2] ; }}Set<Long> h ;int n ; int[] sel ;void dfs(int id , int s){if(s == n){long sum = 0 ; for(int i = 0 ; i < n ; i++){sum += fib[sel[i]] ;}h.add(sum) ;return ;}for(int i = id ; i < 25 ; i++){sel[s] = i ; dfs(id , s+1) ;}}void solve(){n = 6 ;sel = new int[n] ;h = new TreeSet<Long>() ;dfs(1 , 0) ;long i = 1 ;while(true){if(! h.contains(i)){System.out.println(i) ;break ; }i++ ;}out.flush() ;}*/void solve(){while(in.hasNext()){int k = in.nextInt() ;long res = 0 ;if(k == 1){res = 4 ;}else if(k == 2){res = 12 ;}else{Mat A = new Mat(new long[][]{{3,-1,1},{1,0,0},{0,0,1}}) ;A = pow(A, k-2) ;res += A.val[0][0] * 12 % Mod ;res += A.val[0][1] * 4 % Mod  ;res += A.val[0][2] ;res %= Mod ;res += Mod ;res %= Mod ;}out.println(res) ;  //out.flush(); }out.flush() ; }final long Mod = 998244353L ;class Mat{long[][] val = new long[3][3] ;Mat(long [][] val){this.val = val ;}Mat(int type){for(int i = 0 ; i < 3 ; i++){Arrays.fill(val[i] , 0) ;}if(type == 1){val[0][0] = val[1][1] = val[2][2] = 1L ;}}}Mat mult(Mat x , Mat y){Mat s = new Mat(0) ;for(int i = 0 ; i < 3 ; i++){for(int j = 0 ; j < 3 ; j++){for(int k = 0 ; k < 3 ; k++){s.val[i][j] += x.val[i][k] * y.val[k][j] ;s.val[i][j] %= Mod ;}}}return s ;}Mat pow(Mat x , int y){Mat s = new Mat(1) ;for(; y > 0 ; y >>= 1){if((y & 1) > 0){s = mult(s, x) ;}x = mult(x, x) ;}return s ; }
}class InputReader {    public BufferedReader reader;    public StringTokenizer tokenizer;    public InputReader(InputStream stream) {    reader = new BufferedReader(new InputStreamReader(stream), 32768);    tokenizer = new StringTokenizer("");    }    private void eat(String s) {    tokenizer = new StringTokenizer(s);    }    public String nextLine() {     try {    return reader.readLine();    } catch (Exception e) {    return null;    }    }    public boolean hasNext() {    while (!tokenizer.hasMoreTokens()) {    String s = nextLine();    if (s == null)    return false;    eat(s);    }    return true;    }    public String next() {    hasNext();    return tokenizer.nextToken();    }    public int nextInt() {    return Integer.parseInt(next());    }    public int[] nextInts(int n) {    int[] nums = new int[n];    for (int i = 0; i < n; i++) {    nums[i] = nextInt();    }    return nums;    }    public long nextLong() {    return Long.parseLong(next());    }    public double nextDouble() {    return Double.parseDouble(next());    }    public BigInteger nextBigInteger() {    return new BigInteger(next());    }    }    




这篇关于hdu 6198 dfs枚举找规律+矩阵乘法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150457

相关文章

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while