題目鏈接:點我
題意:
給周長,求能圍成的戰場數目,不包括矩形。
思路:
矩陣快速冪;
如果包含矩形的話,對應的則是斐波那契數列的偶數項,所以對應減去矩形的個數即可
代碼:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int mod = 987654321;
struct mat{
LL a[3][3];
mat(){memset(a, 0, sizeof(a)); }
mat operator *( const mat q){
mat c;
for(int i = 1; i <= 2; ++i)
for(int k = 1; k <= 2; ++k)
if(a[i][k])
for(int j = 1; j <= 2; ++j){
c.a[i][j] += a[i][k] * q.a[k][j];
if(c.a[i][j] >= mod)
c.a[i][j] %= mod;
}return c;
}
};
mat qpow(mat x, LL n){
mat ans;
ans.a[1][1] = ans.a[2][2] = 1;
while(n){
if(n&1) ans = ans * x;
x = x * x;
n >>= 1;
}return ans;
}
int main(){
LL p;
while(scanf("%lld", &p) != EOF&& p){
if(p < 8 || p&1){
printf("0\n");
continue;
}mat ans;
ans.a[1][1] = ans.a[2][1] = ans.a[1][2] = 1;
ans = qpow(ans, p-4);
LL sum = (ans.a[1][1] - p/2 + 1 + mod) % mod;
printf("%lld\n",sum);
}return 0;
}