以下是引用crackerwang在2007-5-30 12:12:07的发言:
昨天晚上想出来的的.感觉还是没有Eastsun的思路强.看来我DP还是没有学会
其实我用的不是DP,呵呵
----------------解决方案--------------------------------------------------------
我当时也注意到A!的阶乘比小于它所有的数字的阶乘之和都要大,但是没有发现最大的那个A(A!<N)刚好是其中的一个元素。刚开始我还觉得有问题。刚才拿笔算了一下。终于搞明白是怎么回事了
----------------解决方案--------------------------------------------------------
呵呵,楼上完全明白了我的代码了.很不错~
----------------解决方案--------------------------------------------------------
ps: zju1222也是个与阶乘有关的题,难度比上面几个大得多,有兴趣的可以做做~
http://acm.zju.edu.cn/show_problem.php?pid=1222
----------------解决方案--------------------------------------------------------
这个题目当时我做过.当时我想到了那个log5(n)的算法我都没有写出来.这里的测试数据都到100^100要用到高精度.郁闷好几天
POJ上有同样一个题目数据弱了不少,很容易过
----------------解决方案--------------------------------------------------------
这个题的测试数据确实有些BT,不过其中的高精度只要实现除法就OK了,也不麻烦.
----------------解决方案--------------------------------------------------------
前几天刚去ACM比赛回来,发现的那些名校的人有好大的差距
----------------解决方案--------------------------------------------------------
后来我写了一个没有通过.只好找前辈们借一个看了一下.他都写了快100行了.顿时我就晕了
[此贴子已经被作者于2007-5-30 17:11:20编辑过]
----------------解决方案--------------------------------------------------------
以下是引用crackerwang在2007-5-30 16:57:47的发言:
后来我写了一个没有通过.只好找前辈们借一个看了一下.他都写了快100行了.顿时我就晕了
100行?没这么夸张吧,
这是我写的代码:
程序代码:
#include<stdio.h>
#include<stdlib.h>
int m2[]={1,4}, m4[] ={1,2,4,3};
int lsr(char buf[],int* start,int end){
int s=*start,t =0,tt;
if(*start>end) return -1;
while(s<=end){
tt=buf[s];
buf[s]=(tt+t)/5;
t= ((tt+t)%5)*10;
s++;
}
while(!buf[*start]&&*start<=end+1) (*start)++;
return t/10;
}
int solve(char buf[],int length){
int start=0,n1=0,n2=0,k=0,mod,m;
if(length==1&&buf[0]<=1) return 1;
while((mod=lsr(buf,&start,length-1))>=0){
n2+=mod*k;
if(mod==2) n2++;
if(mod==4) n1++;
k++;
}
m= m2[n1%2]*m4[n2%4]%5;
return m&1?m+5:m;
}
main(){
char buf[200];
int k,len;
while(scanf(\"%s\",buf)!=EOF){
len =strlen(buf);
for(k=0;k<len;k++) buf[k]-='0';
printf(\"%d\n\",solve(buf,len));
}
return 0;
}
应该还可以再简单些
----------------解决方案--------------------------------------------------------
呵呵,自己写的,觉得和你们的差距太大了
main()
{int i,j=1,m=1,b=0,n;
int a[10];
for(n=0;n<10;n++)
scanf("%d\n",&a[n]);
for(n=0;n<10;n++)
{b=0;m=1;j=1;
do{m=m*j;
b=b+m;
j++;}
while(b<a[n]);
if(b==a[n])printf("yes\n");
else printf("no\n");}
}
要好好的把你们的研究一下
----------------解决方案--------------------------------------------------------