方便自己复习回顾
我在vc++编译的所以用__int64定义超级大数
2040亲和数
http://acm.hdu.edu.cn/showproblem.php?pid=2040
#include
int main()
{
int i,m;int a;
scanf("%d",&a);
while(a--){
scanf("%d%d",&i,&m);
int sum1=0,sum2=0;
for(int j=1;j<i;j++){
if(i%j==0) {sum1+=j;}//求余相加就行
}
for(int n=1;n<m;n++){
if(m%n==0) {sum2+=n;}
}
if(sum1==m&&sum2==i) {printf("YES\n");}
else {printf("NO\n");}
}
return 0;
}
2041超级楼梯
http://acm.hdu.edu.cn/showproblem.php?pid=2041
#include < stdio.h>
int main(){
int n, x = 0, a[45] = {1,1,1,2};
for (int i = 4; i <= 41;i++)
a[i]= a[i - 1] + a[i - 2];
scanf("%d", &n);
while(n--){
scanf("%d",&x);
printf("%d\n",a[x]);
}
return 0;
}
2042不容易系列之二
http://acm.hdu.edu.cn/showproblem.php?pid=2042
#include
int main()
{
int m,j;
scanf("%d",&j);
while(j--){
int sum1=3,sum2=0;
scanf("%d",&m);
for(int i=0;i<m;i++){
sum2=(sum1-1)*2;
sum1=sum2;
}
printf("%d\n",sum1);
}
return 0;
}
2043密码
http://acm.hdu.edu.cn/showproblem.php?pid=2043
#include
#include
#include
int main()
{
int i,j;char c[50];
scanf("%d%*c",&j);
while(j--){
scanf("%s",c);
int n=strlen(c),sum1=0,sum2=0,sum3=0,sum4=0;
int t=0;
for(i=0;i<n;i++){
if(islower(c[i])) {sum1++;}
else if(isupper(c[i])) {sum2++;}
else if(isdigit(c[i])) {sum3++;}
else {sum4++;}
}
if(sum1!=0) {t++;}
if(sum2!=0) {t++;}
if(sum3!=0) {t++;}
if(sum4!=0) {t++;}
if(n>=8&&n<=16&&t>=3)
{printf("YES\n");}
else
{printf("NO\n");}
}
return 0;
}
2044一只小蜜蜂…
http://acm.hdu.edu.cn/showproblem.php?pid=2044
#include
int main()
{
__int64 s[50]={1,1,2};//数大会溢出
int j,a,b;
for(int i=3;i<50;i++){
s[i]=s[i-1]+s[i-2];
}
scanf("%d",&j);
while(j--){
scanf("%d%d",&a,&b);
printf("%I64d\n",s[b-a]);
}
return 0;
}
2045不容易系列之(3)—— LELE的RPG难题
http://acm.hdu.edu.cn/showproblem.php?pid=2045
思路:// n>=4时,考虑前n-1格已经定了情况(合法),由于首尾颜色不同,如果是加1格的话,其颜色只有1种可选,所以如果n格是从n-1格的基础上加一格而来,那么涂法数量是相同的,即这种情况f(n)=f(n-1);//考虑前n-2格已经定了情况,n-1取与第1格颜色相同(这个情况不会与前n-1格合法重叠),那么第n格有2种颜色可选,即这种情况f(n)=f(n-2)*2。综合这两种情况得f(n)=f(n-2)*2。
#include
int main() {
int n, i;
__int64 a[50]={3, 6, 6};
for(i=3; i<50; i++)
{ a[i] = a[i-1] + a[i-2] * 2;}
while(~scanf("%d", &n)) {
printf("%I64d\n", a[n-1]);
}
return 0;
}
2046题骨牌铺方格
http://acm.hdu.edu.cn/showproblem.php?pid=2046
又是斐波那契数列
#include
int main()
{
__int64 a[51]={0,1,2};int n;
for(int i=3;i<=50;i++)
a[i]=a[i-1]+a[i-2];
while(~scanf("%d",&n))
{
printf("%I64d\n",a[n]);
}
return 0;
}
2047阿牛的EOF牛肉串
http://acm.hdu.edu.cn/showproblem.php?pid=2047
#include
int main()
{
int n;
__int64 s[40]={3,8};
for(int i=2;i<40;i++)
{s[i]=2*(s[i-1]+s[i-2]);}
while(~scanf("%d",&n)){
printf("%I64d\n",s[n-1]);
}
return 0;
}
2048、2049这两题很相似
2048神、上帝以及老天爷
http://acm.hdu.edu.cn/showproblem.php?pid=2048
#include
int main(){
int c,i;
scanf("%d",&c);
while(c--){
int n;
scanf("%d",&n);
double a[20]={1,2},b[20]={2,6};
for(i=2;i<20;i++){
a[i]=(i+1)*(a[i-1]+a[i-2]);
b[i]=b[i-1]*(i+2);
}
printf("%.2lf%%\n",a[n-2]/b[n-2]*100);
}
return 0;
}
2049不容易系列之(4)——考新郎
http://acm.hdu.edu.cn/showproblem.php?pid=2049
#include
int main(){
int c;
scanf("%d",&c);
while(c--){
int n,m,i,j,b=1;
scanf("%d%d",&n,&m);
__int64 a[21]={0,0,1,2},s;
for(i=3;i<=m;i++)
a[i]=(i-1)*(a[i-1]+a[i-2]);//把m个人全排错的可能种数存放在数组a中,全排错参见2048
for(i=n-m+1,j=1;i<=n;i++,j++)
b=b*i/j;//计算n个人当中m个人的选取种数
s=b*a[m];
printf("%I64d\n",s);
}
return 0;
}