void main() { long n; int a[2][2]; while(scanf("%ld",&n)&&n!=-1) { fenzhi(n,a); printf("%d\n",a[0][1]%10000); } }
void fenzhi(string num, string tmp, long long target,long long cur, long long prev) { if (cur == target && num.size() == 0) { res.push_back(tmp); return; } for (int i = 1; i <= num.size(); i++) { string cs = num.substr(0, i); if (cs.size() > 1 && cs[0] == '0') { return; } long long curNum = atoll(cs.c_str()); string next = num.substr(i); if (tmp.size() != 0) { fenzhi(next, tmp + "*" + cs, target, (cur - prev) + prev*curNum, prev*curNum); fenzhi(next, tmp + "+" + cs, target, (cur + curNum), curNum); fenzhi(next, tmp + "-" + cs, target, (cur - curNum), -curNum); }else{ fenzhi(next, cs, target, curNum, curNum); } } }
void fenzhi(long n,int a[2][2]) { int c[2][2],b[2][2]; if(n==0) a[0][0]=1,a[0][1]=0,a[1][0]=0,a[1][1]=1; else if(n==1) a[0][0]=0,a[0][1]=1,a[1][0]=1,a[1][1]=1; else { fenzhi(n/2,b); if(n%2==0) c[0][0]=b[0][0],c[0][1]=b[0][1],c[1][0]=b[1][0],c[1][1]=b[1][1]; else c[0][0]=b[1][0],c[0][1]=(b[0][0]+b[0][1])%10000,c[1][0]=b[1][1],c[1][1]=(b[1][0]+b[1][1])%10000; a[0][0]=(b[0][0]*c[0][0]+b[0][1]*c[1][0])%10000; a[0][1]=(b[0][0]*c[0][1]+b[0][1]*c[1][1])%10000; a[1][0]=(b[1][0]*c[0][0]+b[1][1]*c[1][0])%10000; a[1][1]=(b[1][0]*c[0][1]+b[1][1]*c[1][1])%10000; } }
vector<string> addOperators(string num, int target) { fenzhi(num, "", target, 0,0); return res; }