原题:
用0~9这十个数字组成是11的倍数的最大十位数是多少。
求解过程:
第一反应是数位dp,接着想偷懒,暴力求解。
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int check(ll x)
{
//函数用来判断是否由0-9组成
int a[10]= {0,};
while(x)
{
a[x%10]++;
x/=10;
}
sort(a,a+10);
if(a[0]!=1||a[9]!=1)return 1;
else return 0;
}
int main()
{
ll x=9876543210/11;//X最大的可能取值
int flag=1;
while(flag)
{
x--;
flag=check(x*11);
}
cout<<x*11<<endl;
return 0;
}
可以得出结果:
然后老师说,这是一道数论题目。
原理:若B进制的数是B+1倍数,则奇数位数字和减去偶数位数字和为B+1的倍数
举两个例子:
我有一个四位数的十进制:
我先在第一位和第三位放两个9:
接下来,如果我需要这个四位数是11的倍数,那么:令(9+9)- 偶数位和=11,则偶数位和我可以取7,那么,取一个5,一个2
用计数器验证一下:9592 ➗ 11 刚好等于872~
第二个例子:二进制的101010
二进制的101010=32+8+2=42.
而42 ➗ 3 刚好等于14~
所以回到我们最开始的那道题目。
由0-9组成的十位数,所以位数和为0+1+2+......+8+9=45.
设奇数位和为X,偶数位和为Y。
则X+Y=45. --------------------------------------------------------------------①
若要让这个数为11的倍数,则X-Y=0,11,22,33,44 ----------②
由X+Y=45是奇数,所以X和Y一奇数一偶数,所以X-Y也应该是奇数
则X-Y=11,33-----------------------------------------------------------------③
结合①③,易得X=28,Y=17.
接下来可以填数了。
因为要求的是最大值,所以我们把98765填在前5位,0填在最后一位。
然后根据28填充剩下的奇数位:
根据17填充剩下来的偶数位:
比较一下:
完美~
Over。