周天的那个成都赛区的short problem真心一点都不会啊,虽然搞数论,真心是零起点。所以先搞下最简单的这种题
P.S. 学会了用<< 和& x<<1 means x div 2 x&1==1 means x is an odd number
用宏定义可以搞定在不同编译环境下改变long long 和__int64 快速改
#include<stdio.h>
#define inta __int64
int a[2][2];
int tmp[2][2];
const int n=10000;
void matr(inta k){
if(k==1){
a[0][0] = 1;
a[0][1] = 1;
a[1][0] = 1;
a[1][1] = 0;
}
else{
matr(k>>1);
tmp[0][0] = (a[0][0] * a[0][0] + a[0][1] * a[1][0])%n;
tmp[0][1] = (a[0][0] * a[0][1] + a[0][1] * a[1][1])%n ;
tmp[1][0] = (a[1][0] * a[0][0] + a[1][1] * a[1][0])%n;
tmp[1][1] = (a[1][0] * a[0][1] + a[1][1] * a[1][1]) %n;
if(k&1){
a[0][0] = (tmp[0][0] + tmp[0][1])%n;
a[0][1] = (tmp[0][0] )%n;
a[1][0] = (tmp[1][0] + tmp[1][1])%n;
a[1][1] = (tmp[1][0] )%n;
}
else{
a[0][0] = tmp[0][0]%n;
a[0][1] = tmp[0][1]%n;
a[1][0] = tmp[1][0]%n;
a[1][1] = tmp[1][1]%n;
}
}
}
int main() {
inta x;
while(scanf("%I64d",&x)!=EOF&&x!=-1){
if(x==0) printf("0\n");
else if(x==1) printf("1\n");
else{
matr(x-1);
printf("%d\n",a[0][0]);
}
}
return 0;
}