牛客算法周周练2 E水题(water) (错误了,白费时间了,警示自己)
错误的原因是进制数可能不是质数,可以由其他数组合出来
云解题,没做比赛,码不出来,只有思路,欢迎指教
已经知道
图片说明
可以推出以下的几个方程
a1
a2
a3
由 第3式子减去 第2式子可以得到
两边同时约去得到式子
也就是
按照该式子递推下去,我们能够发现就是一个斐波那契数列
第一项
判断x是不是斐波那契数列,
可以用map标记,也可以用矩阵快速幂判断是否是斐波那契数
第二项
判断x的阶乘,在m进制下的0的个数
设置x的阶乘为tmp
简单可以知道,如果tmp能够整除m一次,那么tmp的m进制就有1个0,能整除多少次就有多少个0
也就是说,我们不必算出tmp,只要能够算出阶乘中的每个数,能够整除m的次数的和就是末尾0的个数
那么我们很容易就可以想到一种很类似欧拉筛的方法
即,符合条件的意思是小于x
m1 符合条件么,m*2符合条件么,到m(m-1)符合条件么
1符合条件么,*2符合条件么,到(m-1)符合条件么
之后我们可以推到m的k次方也是满足条件的,是最大的小于 x的数
我们知道如果是满足条件的那么,也一定满足条件
假设我们已经找到是符合条件的,那么它之前的数也一定是成立的,
那么能整除m且不重复的有(m-1)个,能整除且不重复的有(m-1)个,能整除且不重复的有(m-1)个
能整除,
首先判断能整除的数有多少个,假设为temp个
int temp=0
for(int i=1;i<=m-1;i++){
if(i*(m的k次方)<=x) temp++; else break; }
那么现在的0的个数=ktemp个
那么之前的0的个数是多少个呢?,设置为sumtemp=0;
已知前面的数都有常数(m-1),那么我们都提取出来
变成(m-1)(,,,…,)
已经知道有几次方就是有多少个0,直接简略表示0的个数的就是
(m-1)(1,2,3,……,k-1)
那么用等差数列的求和公式我们就可以算出,有0的个数
sumtemp=(m-1)(k-1)(k-1+1)/2
那么一共有多少个0呢?
设0的个数的总数为设为sum
sum=ktemp+sumtemp的个数
第三项判断n皇后问题的总数
找到一个板子,直接打表就可以了
1,0,0,2,10,4,40,92,352,724,2680,14200,737712