先讲大概的题意:给你一个0-9的序列,和一个素数Q。序列的任意一个部分拿出来可以当作十进制的数来进行读,要求是不能含有前缀0的正整数。现在问你这样的序列有多少个?
一道在原本应该在能力范围内的题目,由于思维固化,没有用科学的方法正反向去证明,最后没有解出来,看到别人的代码后恍然大物,原来还是那种区间统计的思想,只是加上了一点小小的数论推导罢了。当然充分性是显然满足的,当时也想到了,必要性没有想到。认真分析了以下,用反证法的确很容易证明出来。具体分析见下面:
1.首先此题是有原型的,先讲一下他的母亲那一题。题意也是给你一个0-9的数字序列和一个素数,问你其中有多少个序列满足他们的数字之和能被这个模数整除。我们的解法是很简单的,就是从开始统计他们的sum%mod的值,如果其中出现两个的模数是相等的。那么他们之差所对应的序列的和模mod便是0,当是或许简单一想就会想的很明白。其实应该有一个充分性和必要性的证明的。由于那里忽略的,直接导致这题,在必要性没有证明的前提下就直接否决了。
2。回归到此题,同样的思路,只是只是多了点小小的数论推导罢了。
(1)如果Q(被模数)不能被10整除即不是2或5,那么num[i][j-1] % Q=0(i<j) 当且仅当num[i]%Q=num[j]%Q
证明:
必要性:由 num[i]%Q=num[j]%Q => (num[i]-num[j])%Q=0
又 num[i]=num[j]+num[i][j-1]*10^(N-j)
得到:
num[i][j-1]*10^(N-j) % Q=0
由于Q不含2,5因子,因此num[i][j-1]%!=0
所以必要性得证;
充分性:显然,倒着写就行了。
(2)如果Q是2或则5,该序列能被Q整除等价于个位数能被Q整除
证明:显然。