题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604
类型:矩阵快速幂
题解:推理可知f(n)=f(n-1)+f(n-3)+f(n-4),构造矩阵
另,这道题C可以通过更改mod次数暴力直接算
C的暴力解法
#include<stdio.h>
int l,mod,ans;
int a[1000006]={0,2,4,6,9};
int main()
{
while(~scanf("%d%d",&l,&mod))
{
if(l>4)
{
for(int i=5;i<=l;i++)
{
a[i]=a[i-1]+a[i-3]+a[i-4];
if(a[i]>=100000000)a[i]%=mod;
}
}
ans=a[l]%mod;
printf("%d\n",ans);
}
return 0;
}
java 矩阵快速幂
import java.util.Scanner;
public class Main {
static int mod;
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
while (kb.hasNext()) {
int l = kb.nextInt();
mod = kb.nextInt();
int ans = 0;
if (l <= 4) {
switch (l) {
case 1:
ans = 2;
break;
case 2:
ans = 4;
break;
case 3:
ans = 6;
break;
case 4:
ans = 9;
break;
}
} else {
Matrix m = new Matrix(4);
m.a[0][0] = m.a[0][2] = m.a[0][3] = 1;
m.a[1][0] = m.a[2][1] = m.a[3][2] = 1;
Matrix ans1 = quick(m, l - 4);
ans = ans1.a[0][0] * 9 + ans1.a[0][1] * 6 + ans1.a[0][2] * 4 + ans1.a[0][3] * 2;
}
ans %= mod;
System.out.println(ans);
}
kb.close();
}
static Matrix quick(Matrix n, int m) {
m--;
Matrix t = new Matrix(n.n);
t.a = n.a;
while (m != 0) {
if ((m & 1) == 1) {
t = t.Multi(n, mod);
}
n = n.Multi(n, mod);
m >>= 1;
}
return t;
}
}
class Matrix {
int a[][];
int n;
public Matrix(int n) {
super();
a = new int[n][n];
this.n = n;
}
public Matrix() {
super();
}
public Matrix Multi(Matrix m, int mod) {
Matrix ans = new Matrix(m.n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
ans.a[i][j] += a[i][k] * m.a[k][j];
}
ans.a[i][j] %= mod;
}
}
return ans;
}
}