UVa 11371 - Number Theory for Newbies
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 11371 - Number Theory for Newbies相关的知识,希望对你有一定的参考价值。
題目:給你一個數字n。將裡面每位的數又一次組合形成a,b。使得a-b最大且是9的倍數。
分析:數論。
題目要求a,b和n的位數同样,不能有前導0。
定理1:交換一個數字中的某兩個位的數,形成的新數組和原數字之差是9的倍數;
證明1:設數字為abc..i..j...xwz。当中每一个字母代表一个位。相应值能够同样,
那么任意交换两位i。j得到的新数字为abc..j..i..xwz,做差为9..90..0 *(i-j)。
所以一定是9的倍数,得证。
通過上面定理能够繼續證明。随意交換随意位數字形成的新數字和原數字的差是9的倍數;
所以取a為最大組合。即遞減序,b為遞增序就可以。
可是,這裡要求位數同样,所以b取首尾不是0的數字的最小值,先取遞增序。
然後,交換第一個非0數和首位的1就可以。
說明:╮(╯▽╰)╭。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; bool cmp1(char a, char b) { return a < b; } bool cmp2(char a, char b) { return a > b; } int main() { char buf[31]; while (gets(buf)) { int len = strlen(buf); long long A = 0LL, B = 0LL; sort(buf, buf+len, cmp1); if (buf[0] == '0') { for (int i = 0; i < len; ++ i) if (buf[i] != '0') { swap(buf[i], buf[0]); break; } } for (int i = 0; i < len; ++ i) A = A*10LL + buf[i]-'0'; sort(buf, buf+len, cmp2); for (int i = 0; i < len; ++ i) B = B*10LL + buf[i]-'0'; printf("%lld - %lld = %lld = 9 * %lld\n",B,A,B-A,(B-A)/9LL); } return 0; }
以上是关于UVa 11371 - Number Theory for Newbies的主要内容,如果未能解决你的问题,请参考以下文章
FZU 2297 Number theory线段树/单点更新/思维
[BZOJ4026]dC Loves Number Theory
A1-2017级算法上机第一次练习赛 P ModricWang's Number Theory II