#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stdbool.h>
//Bai 1:Hàm kiểm tra số fibonacy
//F(0) = 0, F(1) = 1
//F(n) = F(n-1) + F(n-2)
//0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368
//int fibonacy(int n){
// int a=0,b=1;
// while(b<n){
// int tmp = a+b;
// a = b;
// b = tmp;
// }
// return(b==n);
//}
//main(){
// int n,i;printf("Nhap N:");scanf("%d",&n);
// if(fibonacy(n)){
// printf("YES");
// }
// else{
// printf("NO");
// }
//}
//*********************************************************************************************************************************
//B2:Nếu không phải Fibonacy,in ra các ước của nó
//int fibo(int n){
// int a=0,b=1;
// while(b<n){
// int temp = a+b;
// a = b;
// b = temp;
// }
// return(b==n);
//}
//main(){
// int n,i;printf("Nhap n:");scanf("%d",&n);
// if(fibo(n)){
// printf("N la Fibonacy");
// }else{
// printf("N khong la Fibonacy\n");
// printf("Uoc cua N la:");
// for(i=1;i<=n;i++){
// if(n % i == 0){
// printf("%d ",i);
// }
// }printf("\n");
// }
//}
//*********************************************************************************************************************************
//B3:In ra tổng tất cả các ước của N.
//int fibo(int n){
// int a=0,b=1;
// while(b<n){
// int temp=a+b;a=b;b=temp;
// }return(b==n);
//}
//main(){
// int n,i;printf("Nhap n:");scanf("%d",&n);
// int sum=0;
// if(fibo(n)){
// printf("YES");
// }else{
// printf("NO\n");
// printf("Uoc cua N la:");
// for(i=1;i<=n;i++){
// if(n % i == 0){
// printf("%d ",i);
// sum += i;
// }
// }printf("\n");
// printf("Tong cac uoc cua N la:%d ",sum);
// }
//}
//*********************************************************************************************************************************
//B4:In ra số lượng các ước số của n.
//int fibo(int n){
// int a=0,b=1;
// while(b<n){
// int temp=a+b;a=b;b=temp;
// }return(b==n);
//}
//main(){
// int n,i;printf("Nhap n:");scanf("%d",&n);
// int sum=0,count=0;
// if(fibo(n)){
// printf("YES");
// }else{
// printf("NO\n");
// printf("Uoc cua N la:");
// printf("So luong uoc cua N la:");
// for(i=1;i<=n;i++){
// if(n % i == 0){
// printf("%d ",i);
// sum += i;
// count++;
// }
// }printf("\n");
// printf("Tong cac uoc cua N la:%d \n",sum);
// printf("So luong uoc cua N la:%d ",count);
// }
//}
//*********************************************************************************************************************************
//B5:Nhập n,in ra các Fibonacy từ 1 đến n.
//int fibo(int n){
// int a=0,b=1;
// while(b<n){
// int tmp=a+b;a=b;b=tmp;
// }return(b==n);
//}
//main(){
// int n,i;printf("Nhap N:");scanf("%d",&n);
// for(i=2;i<=n;i++){
// if(fibo(i)){
// printf("%d ",i);
// }
// }
//}
//*********************************************************************************************************************************
//B6:In ra n số Fibonacci đầu tiên.
//int f(int n){
// int a=0,b=1;
// while(b<n){
// int tmp = a+b;a=b;b=tmp;
// }return(b==n);
//}
//main(){
// int n,i;scanf("%d",&n);
// int count=0,sohientai=2;
// while(count<=n){
// if(f(sohientai)){
// printf("%d ",sohientai);
// count++;
// }sohientai++;
// }
//}
//*********************************************************************************************************************************
//B7:In ra 3 số Fibonacci lớn hơn n.
//int f(int n){
// int a=0,b=1;
// while(b<n){
// int tmp=a+b;a=b;b=tmp;
// }return(b==n);
//}
//main(){
// int n,i;scanf("%d",&n);
// int count=0;
// for(i=n+1;count<3;i++){
// if(f(i)){
// printf("%d ",i);
// count++;
// }
// }
//}
//*********************************************************************************************************************************
//B8:In ra 2 số Fibonacci, một số lớn hơn và một số nhỏ hơn n (gần n nhất).
//int f(int n){
// int a=0,b=1;
// while(b<n){
// int temp = a+b;a=b;b=temp;
// }return(b==n);
//}
//main(){
// int n;scanf("%d",&n);
// int sohientai,i=-1,j=-1;
// for(sohientai=n-1;sohientai>1;sohientai--){
// if(f(sohientai)){
// i = sohientai;break;
// }
// }
// for(sohientai=n+1;;sohientai++){
// if(f(sohientai)){
// j = sohientai;break;
// }
// }
// if(i != -1) printf("Lon:%d\n",i);
// if(j != -1) printf("Nho:%d\n",j);
//}
//*********************************************************************************************************************************
//B9:In ra 4 số Fibonacci, 2 số lớn hơn và 2 số nhỏ hơn n.
//int f(int n){
// int a=0,b=1;
// while(b<n){
// int tmp = a+b;a=b;b=tmp;
// }return(b==n);
//}
//main(){
// int i,n;scanf("%d",&n);
// int sohientai,dem_i=0,dem_j=0;
// printf("Fibonacy nho hon N:\n");
// for(sohientai=n-1;sohientai>1 && dem_i < 2;sohientai--){
// if(f(sohientai)){
// printf("%d ",sohientai);
// dem_i++;
// }
// }printf("\n");
// printf("Fibonacy lon hon N:\n");
// for(sohientai=n+1;dem_j < 2;sohientai++){
// if(f(sohientai)){
// printf("%d ",sohientai);
// dem_j++;
// }
// }printf("\n");
//}
//*********************************************************************************************************************************
//B10:Nhập n, p, q, in ra p số Fibonacci nhỏ hơn n và q số Fibonacci lớn hơn n.
//int f(int n){
// int a=0,b=1;
// while(b<n){
// int temp = a+b;a=b;b=temp;
// }return(b==n);
//}
//main(){
// int n, p, q, sohientai, dem_k = 0, dem_j = 0;
// scanf("%d%d%d", &n, &p, &q);
// printf("Fibonacy nho hon N:\n");
// for (sohientai = n - 1; sohientai > 1 && dem_k < p; sohientai--) {
// if (f(sohientai)) {
// printf("%d ", sohientai);
// dem_k++;
// }
// }printf("\n");
// printf("Fibonacy lon hon N:\n");
// for (sohientai = n + 1; dem_j < q; sohientai++) {
// if (f(sohientai)) {
// printf("%d ", sohientai);
// dem_j++;
// }
// }printf("\n");
//}
//*********************************************************************************************************************************
//B11:In ra các số Fibonacci (có 3 hoặc có 4 chữ số) mà có
//tổng các chữ số chia hết cho 5.
//int f(int n){
// int a=0,b=1;
// while(b<n){
// int temp=a+b;a=b;b=temp;
// }return(b==n);
//}
//int tong(int chuso){
// int sum = 0;
// while(chuso > 0){
// sum += chuso % 10;
// chuso /= 10;
// }return sum;
//}
//main(){
// int n,i;printf("Nhap N: ");scanf("%d",&n);
// printf("Cac so Fibonacy co tong cac chu so chia het cho 5:\n");
// for(i=100;i<=n;i++){
// if(f(i)){
// int sum = tong(i);
// if(sum % 5 == 0){
// printf("%d ",i);
// }
// }
// }printf("\n");
//}
//B12:nhập n, tìm các số vừa là Palindrome vừa là Fibonacy nhỏ hơn n
int fibonacy(int n){
int a=0,b=1,temp;
while(b<n){
temp = a+b;a=b;b=temp;
}return(b==n);
}
int palindrome(int n){//palindrome:so doi xung VD:121,44,12321
int reversed=0,remainder,original=n;//reversed:so dao nguoc
while (n != 0) {//remainder:so con lai // original:Giu gia tri goc cua n
remainder = n % 10;
reversed = reversed * 10 + remainder;
n /= 10;
}return (reversed == original);
}
//original lưu giá trị 121 để so sánh.
//reversed ban đầu là 0, sau đó sẽ dần được xây dựng thành 121 (số đảo ngược).
//remainder dùng để tách từng chữ số từ n.
main(){
printf("Cac so Palindrome va Fibonacci nho hon %d:\n", n
); for(i=1;i<=n;i++){
if (fibonacy(i) && palindrome(i)){
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkYm9vbC5oPgoKLy9CYWkgMTpIw6BtIGtp4buDbSB0cmEgc+G7kSBmaWJvbmFjeQovL0YoMCkgPSAwLCBGKDEpID0gMQovL0YobikgPSBGKG4tMSkgKyBGKG4tMikKLy8wLCAxLCAxLCAyLCAzLCA1LCA4LCAxMywgMjEsIDM0LCA1NSwgODksIDE0NCwgMjMzLCAzNzcsIDYxMCwgOTg3LCAxNTk3LCAyNTg0LCA0MTgxLCA2NzY1LCAxMDk0NiwgMTc3MTEsIDI4NjU3LCA0NjM2OAovL2ludCBmaWJvbmFjeShpbnQgbil7Ci8vCWludCBhPTAsYj0xOwovLwl3aGlsZShiPG4pewovLwkJaW50IHRtcCA9IGErYjsKLy8JCWEgPSBiOwovLwkJYiA9IHRtcDsKLy8JfQovLwlyZXR1cm4oYj09bik7Ci8vfQovL21haW4oKXsKLy8JaW50IG4saTtwcmludGYoIk5oYXAgTjoiKTtzY2FuZigiJWQiLCZuKTsKLy8JaWYoZmlib25hY3kobikpewovLwkJcHJpbnRmKCJZRVMiKTsKLy8JfQovLwllbHNlewovLwkJcHJpbnRmKCJOTyIpOwovLwl9Ci8vfQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovL0IyOk7hur91IGtow7RuZyBwaOG6o2kgRmlib25hY3ksaW4gcmEgY8OhYyDGsOG7m2MgY+G7p2EgbsOzCi8vaW50IGZpYm8oaW50IG4pewovLwlpbnQgYT0wLGI9MTsKLy8Jd2hpbGUoYjxuKXsKLy8JCWludCB0ZW1wID0gYStiOwovLwkJYSA9IGI7Ci8vCQliID0gdGVtcDsKLy8JfQovLwlyZXR1cm4oYj09bik7Ci8vfQovL21haW4oKXsKLy8JaW50IG4saTtwcmludGYoIk5oYXAgbjoiKTtzY2FuZigiJWQiLCZuKTsKLy8JaWYoZmlibyhuKSl7Ci8vCQlwcmludGYoIk4gbGEgRmlib25hY3kiKTsKLy8JfWVsc2V7Ci8vCQlwcmludGYoIk4ga2hvbmcgbGEgRmlib25hY3lcbiIpOwovLwkJcHJpbnRmKCJVb2MgY3VhIE4gbGE6Iik7Ci8vCQlmb3IoaT0xO2k8PW47aSsrKXsKLy8JCQlpZihuICUgaSA9PSAwKXsKLy8JCQkJcHJpbnRmKCIlZCAiLGkpOwovLwkJCX0KLy8JCX1wcmludGYoIlxuIik7Ci8vCX0KLy99CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovL0IzOkluIHJhIHThu5VuZyB04bqldCBj4bqjIGPDoWMgxrDhu5tjIGPhu6dhIE4uCi8vaW50IGZpYm8oaW50IG4pewovLwlpbnQgYT0wLGI9MTsKLy8Jd2hpbGUoYjxuKXsKLy8JCWludCB0ZW1wPWErYjthPWI7Yj10ZW1wOwovLwl9cmV0dXJuKGI9PW4pOwovL30KLy9tYWluKCl7Ci8vCWludCBuLGk7cHJpbnRmKCJOaGFwIG46Iik7c2NhbmYoIiVkIiwmbik7Ci8vCWludCBzdW09MDsKLy8JaWYoZmlibyhuKSl7Ci8vCQlwcmludGYoIllFUyIpOwovLwl9ZWxzZXsKLy8JCXByaW50ZigiTk9cbiIpOwovLwkJcHJpbnRmKCJVb2MgY3VhIE4gbGE6Iik7Ci8vCQlmb3IoaT0xO2k8PW47aSsrKXsKLy8JCQlpZihuICUgaSA9PSAwKXsKLy8JCQkJcHJpbnRmKCIlZCAiLGkpOwovLwkJCQlzdW0gKz0gaTsKLy8JCQl9Ci8vCQl9cHJpbnRmKCJcbiIpOwovLwkJcHJpbnRmKCJUb25nIGNhYyB1b2MgY3VhIE4gbGE6JWQgIixzdW0pOwovLwl9Ci8vfQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovL0I0OkluIHJhIHPhu5EgbMaw4bujbmcgY8OhYyDGsOG7m2Mgc+G7kSBj4bunYSBuLgovL2ludCBmaWJvKGludCBuKXsKLy8JaW50IGE9MCxiPTE7Ci8vCXdoaWxlKGI8bil7Ci8vCQlpbnQgdGVtcD1hK2I7YT1iO2I9dGVtcDsKLy8JfXJldHVybihiPT1uKTsKLy99Ci8vbWFpbigpewovLwlpbnQgbixpO3ByaW50ZigiTmhhcCBuOiIpO3NjYW5mKCIlZCIsJm4pOwovLwlpbnQgc3VtPTAsY291bnQ9MDsKLy8JaWYoZmlibyhuKSl7Ci8vCQlwcmludGYoIllFUyIpOwovLwl9ZWxzZXsKLy8JCXByaW50ZigiTk9cbiIpOwovLwkJcHJpbnRmKCJVb2MgY3VhIE4gbGE6Iik7Ci8vCQlwcmludGYoIlNvIGx1b25nIHVvYyBjdWEgTiBsYToiKTsKLy8JCWZvcihpPTE7aTw9bjtpKyspewovLwkJCWlmKG4gJSBpID09IDApewovLwkJCQlwcmludGYoIiVkICIsaSk7Ci8vCQkJCXN1bSArPSBpOwovLwkJCQljb3VudCsrOwovLwkJCX0KLy8JCX1wcmludGYoIlxuIik7Ci8vCQlwcmludGYoIlRvbmcgY2FjIHVvYyBjdWEgTiBsYTolZCBcbiIsc3VtKTsKLy8JCXByaW50ZigiU28gbHVvbmcgdW9jIGN1YSBOIGxhOiVkICIsY291bnQpOwovLwl9Ci8vfQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovL0I1Ok5o4bqtcCBuLGluIHJhIGPDoWMgRmlib25hY3kgdOG7qyAxIMSR4bq/biBuLgovL2ludCBmaWJvKGludCBuKXsKLy8JaW50IGE9MCxiPTE7Ci8vCXdoaWxlKGI8bil7Ci8vCQlpbnQgdG1wPWErYjthPWI7Yj10bXA7Ci8vCX1yZXR1cm4oYj09bik7Ci8vfQovL21haW4oKXsKLy8JaW50IG4saTtwcmludGYoIk5oYXAgTjoiKTtzY2FuZigiJWQiLCZuKTsKLy8JZm9yKGk9MjtpPD1uO2krKyl7Ci8vCQlpZihmaWJvKGkpKXsKLy8JCQlwcmludGYoIiVkICIsaSk7Ci8vCQl9Ci8vCX0KLy99Ci8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vQjY6SW4gcmEgbiBz4buRIEZpYm9uYWNjaSDEkeG6p3UgdGnDqm4uCi8vaW50IGYoaW50IG4pewovLwlpbnQgYT0wLGI9MTsKLy8Jd2hpbGUoYjxuKXsKLy8JCWludCB0bXAgPSBhK2I7YT1iO2I9dG1wOwovLwl9cmV0dXJuKGI9PW4pOwovL30KLy9tYWluKCl7Ci8vCWludCBuLGk7c2NhbmYoIiVkIiwmbik7Ci8vCWludCBjb3VudD0wLHNvaGllbnRhaT0yOwovLwl3aGlsZShjb3VudDw9bil7Ci8vCQlpZihmKHNvaGllbnRhaSkpewovLwkJCXByaW50ZigiJWQgIixzb2hpZW50YWkpOwovLwkJCWNvdW50Kys7Ci8vCQl9c29oaWVudGFpKys7Ci8vCX0KLy99Ci8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vQjc6SW4gcmEgMyBz4buRIEZpYm9uYWNjaSBs4bubbiBoxqFuIG4uCi8vaW50IGYoaW50IG4pewovLwlpbnQgYT0wLGI9MTsKLy8Jd2hpbGUoYjxuKXsKLy8JCWludCB0bXA9YStiO2E9YjtiPXRtcDsKLy8JfXJldHVybihiPT1uKTsKLy99Ci8vbWFpbigpewovLwlpbnQgbixpO3NjYW5mKCIlZCIsJm4pOwovLwlpbnQgY291bnQ9MDsKLy8JZm9yKGk9bisxO2NvdW50PDM7aSsrKXsKLy8JCWlmKGYoaSkpewovLwkJCXByaW50ZigiJWQgIixpKTsKLy8JCQljb3VudCsrOwovLwkJfQovLwl9Ci8vfQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovL0I4OkluIHJhIDIgc+G7kSBGaWJvbmFjY2ksIG3hu5l0IHPhu5EgbOG7m24gaMahbiB2w6AgbeG7mXQgc+G7kSBuaOG7jyBoxqFuIG4gKGfhuqduIG4gbmjhuqV0KS4KLy9pbnQgZihpbnQgbil7Ci8vCWludCBhPTAsYj0xOwovLwl3aGlsZShiPG4pewovLwkJaW50IHRlbXAgPSBhK2I7YT1iO2I9dGVtcDsKLy8JfXJldHVybihiPT1uKTsKLy99Ci8vbWFpbigpewovLwlpbnQgbjtzY2FuZigiJWQiLCZuKTsKLy8JaW50IHNvaGllbnRhaSxpPS0xLGo9LTE7Ci8vCWZvcihzb2hpZW50YWk9bi0xO3NvaGllbnRhaT4xO3NvaGllbnRhaS0tKXsKLy8JCWlmKGYoc29oaWVudGFpKSl7Ci8vCQkJaSA9IHNvaGllbnRhaTticmVhazsKLy8JCX0KLy8JfQovLwlmb3Ioc29oaWVudGFpPW4rMTs7c29oaWVudGFpKyspewovLwkJaWYoZihzb2hpZW50YWkpKXsKLy8JCQlqID0gc29oaWVudGFpO2JyZWFrOwovLwkJfQovLwl9Ci8vCWlmKGkgIT0gLTEpCXByaW50ZigiTG9uOiVkXG4iLGkpOwovLwlpZihqICE9IC0xKQlwcmludGYoIk5obzolZFxuIixqKTsKLy99Ci8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vQjk6SW4gcmEgNCBz4buRIEZpYm9uYWNjaSwgMiBz4buRIGzhu5tuIGjGoW4gdsOgIDIgc+G7kSBuaOG7jyBoxqFuIG4uCi8vaW50IGYoaW50IG4pewovLwlpbnQgYT0wLGI9MTsKLy8Jd2hpbGUoYjxuKXsKLy8JCWludCB0bXAgPSBhK2I7YT1iO2I9dG1wOwovLwl9cmV0dXJuKGI9PW4pOwovL30KLy9tYWluKCl7Ci8vCWludCBpLG47c2NhbmYoIiVkIiwmbik7Ci8vCWludCBzb2hpZW50YWksZGVtX2k9MCxkZW1faj0wOwovLwlwcmludGYoIkZpYm9uYWN5IG5obyBob24gTjpcbiIpOwovLwlmb3Ioc29oaWVudGFpPW4tMTtzb2hpZW50YWk+MSAmJiBkZW1faSA8IDI7c29oaWVudGFpLS0pewovLwkJaWYoZihzb2hpZW50YWkpKXsKLy8JCQlwcmludGYoIiVkICIsc29oaWVudGFpKTsKLy8JCQlkZW1faSsrOwovLwkJfQovLwl9cHJpbnRmKCJcbiIpOwovLwlwcmludGYoIkZpYm9uYWN5IGxvbiBob24gTjpcbiIpOwovLwlmb3Ioc29oaWVudGFpPW4rMTtkZW1faiA8IDI7c29oaWVudGFpKyspewovLwkJaWYoZihzb2hpZW50YWkpKXsKLy8JCQlwcmludGYoIiVkICIsc29oaWVudGFpKTsKLy8JCQlkZW1faisrOwovLwkJfQovLwl9cHJpbnRmKCJcbiIpOwovL30KCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi8vQjEwOk5o4bqtcCBuLCBwLCBxLCBpbiByYSBwIHPhu5EgRmlib25hY2NpIG5o4buPIGjGoW4gbiB2w6AgcSBz4buRIEZpYm9uYWNjaSBs4bubbiBoxqFuIG4uCi8vaW50IGYoaW50IG4pewovLwlpbnQgYT0wLGI9MTsKLy8Jd2hpbGUoYjxuKXsKLy8JCWludCB0ZW1wID0gYStiO2E9YjtiPXRlbXA7Ci8vCX1yZXR1cm4oYj09bik7Ci8vfQovL21haW4oKXsKLy8gICAgaW50IG4sIHAsIHEsIHNvaGllbnRhaSwgZGVtX2sgPSAwLCBkZW1faiA9IDA7Ci8vICAgIHNjYW5mKCIlZCVkJWQiLCAmbiwgJnAsICZxKTsKLy8gICAgcHJpbnRmKCJGaWJvbmFjeSBuaG8gaG9uIE46XG4iKTsKLy8gICAgZm9yIChzb2hpZW50YWkgPSBuIC0gMTsgc29oaWVudGFpID4gMSAmJiBkZW1fayA8IHA7IHNvaGllbnRhaS0tKSB7Ci8vICAgICAgICBpZiAoZihzb2hpZW50YWkpKSB7Ci8vICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBzb2hpZW50YWkpOwovLyAgICAgICAgICAgIGRlbV9rKys7Ci8vICAgICAgICB9Ci8vICAgIH1wcmludGYoIlxuIik7Ci8vICAgIHByaW50ZigiRmlib25hY3kgbG9uIGhvbiBOOlxuIik7Ci8vICAgIGZvciAoc29oaWVudGFpID0gbiArIDE7IGRlbV9qIDwgcTsgc29oaWVudGFpKyspIHsKLy8gICAgICAgIGlmIChmKHNvaGllbnRhaSkpIHsKLy8gICAgICAgICAgICBwcmludGYoIiVkICIsIHNvaGllbnRhaSk7Ci8vICAgICAgICAgICAgZGVtX2orKzsKLy8gICAgICAgIH0KLy8gICAgfXByaW50ZigiXG4iKTsKLy99CgovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovL0IxMTpJbiByYSBjw6FjIHPhu5EgRmlib25hY2NpIChjw7MgMyBob+G6t2MgY8OzIDQgY2jhu68gc+G7kSkgbcOgIGPDsyAKLy904buVbmcgY8OhYyBjaOG7ryBz4buRIGNoaWEgaOG6v3QgY2hvIDUuCi8vaW50IGYoaW50IG4pewovLwlpbnQgYT0wLGI9MTsKLy8Jd2hpbGUoYjxuKXsKLy8JCWludCB0ZW1wPWErYjthPWI7Yj10ZW1wOwovLwl9cmV0dXJuKGI9PW4pOwkKLy99Ci8vaW50IHRvbmcoaW50IGNodXNvKXsKLy8JaW50IHN1bSA9IDA7Ci8vCXdoaWxlKGNodXNvID4gMCl7Ci8vCQlzdW0gKz0gY2h1c28gJSAxMDsKLy8JCWNodXNvIC89IDEwOwovLwl9cmV0dXJuIHN1bTsKLy99Ci8vbWFpbigpewovLwlpbnQgbixpO3ByaW50ZigiTmhhcCBOOiAiKTtzY2FuZigiJWQiLCZuKTsKLy8JcHJpbnRmKCJDYWMgc28gRmlib25hY3kgY28gdG9uZyBjYWMgY2h1IHNvIGNoaWEgaGV0IGNobyA1OlxuIik7Ci8vCWZvcihpPTEwMDtpPD1uO2krKyl7Ci8vCQlpZihmKGkpKXsKLy8JCQlpbnQgc3VtID0gdG9uZyhpKTsKLy8JCQlpZihzdW0gJSA1ID09IDApewovLwkJCQlwcmludGYoIiVkICIsaSk7Ci8vCQkJfQovLwkJfQovLwl9cHJpbnRmKCJcbiIpOwovL30KCgovL0IxMjpuaOG6rXAgbiwgdMOsbSBjw6FjIHPhu5EgduG7q2EgbMOgIFBhbGluZHJvbWUgduG7q2EgbMOgIEZpYm9uYWN5IG5o4buPIGjGoW4gbiAKaW50IGZpYm9uYWN5KGludCBuKXsKCWludCBhPTAsYj0xLHRlbXA7Cgl3aGlsZShiPG4pewoJCXRlbXAgPSBhK2I7YT1iO2I9dGVtcDsKCX1yZXR1cm4oYj09bik7Cn0KCmludCBwYWxpbmRyb21lKGludCBuKXsvL3BhbGluZHJvbWU6c28gZG9pIHh1bmcgVkQ6MTIxLDQ0LDEyMzIxCglpbnQgcmV2ZXJzZWQ9MCxyZW1haW5kZXIsb3JpZ2luYWw9bjsvL3JldmVyc2VkOnNvIGRhbyBuZ3VvYyAKCXdoaWxlIChuICE9IDApIHsvL3JlbWFpbmRlcjpzbyBjb24gbGFpIC8vIG9yaWdpbmFsOkdpdSBnaWEgdHJpIGdvYyBjdWEgbgogICAgICAgIHJlbWFpbmRlciA9IG4gJSAxMDsKICAgICAgICByZXZlcnNlZCA9IHJldmVyc2VkICogMTAgKyByZW1haW5kZXI7CiAgICAgICAgbiAvPSAxMDsKCX1yZXR1cm4gKHJldmVyc2VkID09IG9yaWdpbmFsKTsKfQovL29yaWdpbmFsIGzGsHUgZ2nDoSB0cuG7iyAxMjEgxJHhu4Mgc28gc8OhbmguCi8vcmV2ZXJzZWQgYmFuIMSR4bqndSBsw6AgMCwgc2F1IMSRw7Mgc+G6vSBk4bqnbiDEkcaw4bujYyB4w6J5IGThu7FuZyB0aMOgbmggMTIxIChz4buRIMSR4bqjbyBuZ8aw4bujYykuCi8vcmVtYWluZGVyIGTDuW5nIMSR4buDIHTDoWNoIHThu6tuZyBjaOG7ryBz4buRIHThu6sgbi4KbWFpbigpewoJaW50IG4saTtzY2FuZigiJWQiLCZuKTsKCXByaW50ZigiQ2FjIHNvIFBhbGluZHJvbWUgdmEgRmlib25hY2NpIG5obyBob24gJWQ6XG4iLCBuKTsKCWZvcihpPTE7aTw9bjtpKyspewoJCWlmIChmaWJvbmFjeShpKSAmJiBwYWxpbmRyb21lKGkpKXsKCQkJcHJpbnRmKCIlZCAiLGkpOwoJCX0KCX0KfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=