这个题的数据规模有点大,10^8,也就是说暴力是不行的了
这个题的思路是,在n!里面取出2和5,然后判断断1379的个数,哎,
这个里面的东西很不错http://duanple.blog.163.com/blog/static/7097176720081016113033592/
#include <string.h> #include <string.h> #include <stdio.h> using namespace std; #define DEBUG 1 #undef DEBUG int get2(int n) { if(n == 0) return 0; return n/2+get2(n/2); } int get5(int n) { if(n == 0) return 0; return n/5+get5(n/5); } int odd_getX(int n,int x) { if(n == 0) return 0; return n/10+(n%10 >= x)+ odd_getX(n/5,x); } int getX(int n,int x) { if(n == 0) return 0; return getX(n/2,x)+odd_getX(n,x); } int solve(int n,int m) { int two,five,one,three,seven,nine; int table[4][4] = { 6,2,4,8,//last digit of 2^4 2 2^2 2^3 1,3,9,7,//...3 1,7,9,3,//...7 1,9,1,9,//...9 }; m = n-m; two = get2(n)-get2(m);//二的个数 five = get5(n)-get5(m);// 5 one = getX(n,1) - getX(m,1); // 1 对结果不起作用 three = getX(n,3) - getX(m,3); // 3 seven = getX(n,7) - getX(m,7); nine = getX(n,9) - getX(m,9); int last_digit = 1; if(two < five) return 5; else { if(two > five) last_digit *= table[0][(two-five)%4]; last_digit *= table[1][three%4]; last_digit *= table[2][seven%4]; last_digit *= table[3][nine%4]; return last_digit % 10; } } int main() { int n,m; while(scanf("%d%d",&n,&m) == 2) { printf("%d\n",solve(n,m)); } }
poj 2282 The Counting Problem
题目大意:求a到b中0到9这十个数字出现的次数
解题思路:f(n) = f(n/10-1)*c + deal(n%10) + deal(出现n%10的时候n/10中的数字)
具体点就是,我们可以先考虑最后一位的情况,例如192 那么到189就是最后一位循环了19次,这样就可以不考虑最后一位了,然后处理最后一位的时候我们还得看路大于189的情况,这个就是后面两项的结果。
poj 1430 Binary Stirling Numbers
题目大意:简单点就是,给出m,n求第二类stirling数是奇数还是偶数
这个题,确实对于我来说有一定的难度,我不会啊,看别人的解题报告,看到了一个不错的思路,但是我算了好几遍,还是没有算对,但是,我还是感觉这个思路很好 ,解题报告推荐如下:
http://gisyhy.blog.163.com/blog/static/12939034320104603214437/
望各位大牛指教
上面的几个题,我觉得都有点奇怪,难道acm就是这么考组合数学的??