n个石头,a和b轮流从这堆石头里面取1-3个石块,第一个取不到石块的人输掉这个游戏,在双人采取最优策略的情况下,a是否会输。[1]最优策略就是看石块数量是否为4的倍数,是4的倍数,不管你怎么操作,最后都会输,1+3,2+2,3+1都等于4,最后你总要面对0,如果石块数量不是4的倍数,那就是除4余1,2,3,你让对面面对4的倍数,你肯定赢。这个游戏的胜态和败态的迭代很简单,但我不看答案我分析不出来,很像脑筋急转弯。脑筋急转弯赛高
不使用乘法、除法和mod运算实现C++的整型除法运算过程。[2]除数不为0。首先考虑特殊情况:INT_MIN(转正会溢出)和0(没有正负的概念)。如果被除数是整型最小值,除以1是它本身,除以-1是整型最大值,因为整型最小值的绝对值比整型最大值大1,如果整型最小值转正数会溢出。如果除数是整型最小值,则被除数是整型最小值时,商为1,否则为0.如果被除数为0,商为0。设符号翻转标志布尔值为false,被除数和除数全部转成正数,用标志布尔值记录最后的结果是否取负。构建除数乘2的次幂的数组,如[6*2^0,6*2^1,\cdots,6*2^n],数组的末尾元素为小于被除数的最大除数乘2的次幂的数。从十进制的除法演算式的过程来看,156/6,首先看156>60,156里有2个60,剩下的36有6个6,故商为26。二进制的除法同理,就是看有1个还是0个,从包含的最大的数开始算起,有1个或0个,1个说明剩余的被除数大于等于除数乘2的次幂,对应结果的位处设为1,得到结果,再看是否套上负号。
非负整数字符串的乘积字符串表示。[3]长度为m的字符串n1和长度为n的字符串n2的乘积字符串的长度为m+n-1到m+n之间,最小的n1为10^{m-1},最小的n2为10^{n-1},最小的乘积为10^{m+n-2},长度为m+n-1,最大的n1为10^m-1,最大的n2为10^n-1,最大的乘积为a=10^{m+n}-10^m-10^n+1,m和n大于等于1,10^m<=10^{m+n-1},10^n<=10^{m+n-1},10^m+10^n<=2*10^{m+n-1},则a>=8*10^{m+n-1}+1,10^n>1,1-10^m-10^n<0,则a<10^{m+n},则a的长度为m+n。声明m+n长度的整型数组,字符串123,3的索引是2,m-1,字符串456,6的索引是2,n-1,3和6的乘积反应在res[i+j+1],即res[5],3+3-1处,n1[i]和n2[j]处的数字的乘积能算出来,后面的10的幂次使这个积往前走多少位,跟乘数当前的位置有关,n1[i]离n1[m-1]多远,n2[j]离n2[n-1]多远,最后res[i+j+1]离结果的个位有多远,对应位处的积加和,碰上进位,保留模,商更新为进位。另一条思路:n1=\sum_{i=0}^{m-1}a_i*10^i,n2=\sum_{j=0}^{n-1}a_j*10^j,设结果res=\sum_{k=0}^{m+n-1}c_k*10^k,则c_k=\sum_{i=0}^ka_i*b_{k-i},这就是前述算法写法的数学原理,参考自字符串相乘,剩下的数学说明有待研究,c序列是a序列和b序列的卷积,即\overrightarrow c=\overrightarrow a \ast \overrightarrow b,(\ast表示星乘号,参考自Latex特殊符号汇集),于是,可以采用快速傅立叶变换(Fast Fourier Transform,FFT)加速卷积的计算,使得时间复杂度降低为O(clogc),c是不小于n+m的最小的2的整数幂。
给出一个1到n的数字的全排列,该全排列满足元素差的绝对值的种数有k个的条件。[4]1到n升序排列,k==1,如果n-1个元素差各不相同的话,这样排列:[1,n,2,n-1,3,n-2,...],两个边界情况考虑完后,则一般情况,面对k,则有[1,2,3,...,n-k,n,n-k+1,n-1,...],最后一个元素差的绝对值一定是1,n-(n-k)==k,后面的元素差的绝对值逐渐减小,则满足元素差的绝对值有k种的条件。
一个正整数num的各位之和,重复各位之和操作直到得到一位数,$num=\sum_{i=0}^{n-1}a_i*10^i=\sum_{i=0}^{n-1}a_i*(10^i-1+1)=\sum_{i=0}^{n-1}a_i*(10^i-1)+\sum_{i=0}^{n-1}a_i$,$\sum_{i=0}^{n-1}a_i*{10^i-1}$是9的倍数,$\sum_{i=0}^{n-1}a_i$是各位之和,则nums和各位之和模9同余,即nums和最终结果模9同余,9的倍数的正整数的最终结果是9,通过(nums-1)%9+1来实现,统一所有正整数的结果。
参考链接:[1].292. Nim 游戏
[2].29. 两数相除
[3].43.字符串相乘
[4].667. 优美的排列 II
[5].258. 各位相加