HDU 1271 數論,有點巧妙,改天再研究

2021-06-09 05:47:43 字數 992 閱讀 6068

假設a中去掉的數在第k+1位,可以把a分成三部分,低位,k,和高位。

a == a + b * 10^k + c * 10^(k+1)

b == a         +         c * 10^k

n == a + b == 2 * a + b * 10^k + c * 10^k * 11

其中b是一位數,b * 10^k不會進製,用10^k除n取整就可以得到b + 11c,再用11除,商和餘數就分別是c和b了。但是這裡有個問題a是乙個小於10^k的數沒錯,但是2a有可能產生進製,這樣就汙染了剛才求出來的b + 11c。但是沒有關係,因為進製最多為1,也就是b可能實際上是b+1,b本來最大是9,那現在即使是10,也不會影響到除11求得的c。因此c的值是可信的。然後根據2a進製和不進製兩種情況,分別考慮b要不要-1,再求a,驗算,就可以了。

迭代k從最低位到最高位做一遍,就可以找出所有可能的a。

# include#include int cmp(const void *a,const void *b)

int main()

}b--;

if((b!=0 || c!=0) && b>=0)

}} if(count==0) printf("no solution.\n");

else

printf("\n");

} }return 0;

}

#include#include#include#includeusing namespace std;

void solve(int x,set&result)

b2=high%11-1;

if((b2!=0||c!=0)&&b2>=0)

}}int main()

else

}return 0;

}

hdu 1271 整數對 詳解

注意事項 1.該數字可以是其本身。例 10本身符合條件。2.結果中可能出現重複數字,使用陣列時注意。例 12結果可能是兩個11。假設x為其一解。把x分為三部分 a,b,c。b為要去掉的那個數字,a為b前面的數字,c為b後面的數字。則 原x a 10 k 1 b 10 k c 變化後y a 10 k ...

hdu1271 整數對 數學題

很有技巧的一道數學題。本題思路 假設要求的數字為a,去除的為第k位,那麼按照這個規則,將a劃分為三段 高位c,k位b,低位a,則x a 10 k 1 b 10 k c去除後為b a 10 k c,那麼n a b 11a b 10 k 2c 但是由於2c有可能帶來進製,可能會使b進1,但是不會對a出現...

hdu 1066 數論 遞迴

hdu 1066 last non zero digit in n 起首引用下leemars的呈報 因為 2 n 是以4為輪迴節的 並且table n 是以10為輪迴節的 所以從10開端 f n 5 table n的尾數 6 f n n 10 2 n 5 mod 4 右邊的式子除了f n 5 外 是...