居然有两次都把 把long long写成%d的 scanf和printf交上去了。。。。。wa了两次。。。
A.B题以后不能再这么2了。
--------------------------(我是可爱的分界线)我的目标是:谁都看得懂-------------------------
C.崔逗逗的难题
题意:给正方形边长求深紫面积,浅紫面积,粉红色。
解法:1.面积小学生都会求,关键是精度。
2.使用long double类型的变量,输出的时候用%Lf。
3.如果把表达式直接放到printf中,也可以水过去,这就要看人品了,反正我是没水过去,唉。
D.崔逗逗给你信心
题意:给n,求0<=x<=n的范围内,有多少个数满足(x)^(2x)^(3x)==0 。结果对1000000009取余。
输入样例
1
2
输出样例
2
解法:
首先,要知道什么叫异或。就是把a和b转换成二进制,a异或b(即a^b)就是把二进制列出来,不同就是1,同样就是0。比如11^23。11就是1101,23就是10111。两者异或就是01010。
其次,要知道什么情况下异或为0,那肯定是两个数完全一样,异或才能一个1都不出现。只有000000000.
所以,x^2x^3x==0等价于x^2x==3x.
再来看看异或和加法的区别。a,b当前位置一个为0,一个为1,那么异或为1,加法也是1,a,b当前位置为两个0,异或为0,加法也为0.。。。。。。只有a.b当前位置两个都是1,异或才和加法不同。显然X+2X=3X,所以现在我们的目标是,找出异或和加法完全一样的数字。
2x相当于x的二进制左移一位。比如3,二进制为11,它的两倍6,二进制为110.也就是说把某个数字,二进制左移一位,它和左移之前的相异或,不出现两个都为1,这样的数字在0到n有几个?也就是1不能和1相邻。
开一个数组f,存进去二进制只有一位时有几种可能,二进制有两位时有几种可能,很容易发现这是一个斐波那契数列,也就是f(n)=f(n-1)+f(n-2)的数列。
现在给出一个n,比如它的二进制为10100,那就令第一位为0,剩下四位随便,也就是res=res+f(4),再接着找下一个1,下一个1在第三个,那就是res=res+f(2),加入最后只剩最后一位。res=res+1;
实现有点麻烦,要用递归。
E. 焦级长搭积木
题意:积木数N,层数H,最底层M个。除最底层,每一层的积木数是它下一层积木数+1或-1且每层积木不超过10个。输出方案数,给出K,要求给出顺序排列的第K种方案(最小的排列为第一种)。
输入样例
13 6 2
1
3
-1
输出样例
3
2 1 2 3 2 3
2 3 2 3 2 1
解法:
1.开一个三维数组dp[n][h][m]表示n个积木有h层最底层为m个的情况。
2.把h=1而且n=m的情况初始化为1,其余初始化为0.......dp[n][h][m]=dp[n-m][h-1][m+1]+dp[n-m][h-1][m-1];相当于抽掉最底层后剩下的状态转移方程。
3.给你一个k。你把[n-m][h-1][m-1]拥有的积木数x和[n-m][h-1][m+1]拥有的积木数比较,如果k比前者小,那就把前者作为下一个状态,如果k比后者大,那就把后者变为下一个状态此时的k变为k-x,一直转移下去直到最顶层。
4.这题的代码还没交。。。。明天提交试试。。。。。
完整地写完了。我觉得自己真是太棒了哈哈哈。