bsp; if (cnt2==0)
cnt2 = 1;
else
cnt2=last[0][cnt2%4];
cnt3=last[1][cnt3%4];
cnt7=last[2][cnt7%4];
cnt9=last[3][cnt9%4];
cout<<cnt2 * cnt3 * cnt7 * cnt9 % 10<<endl;
}
else
cout<<5<<endl;
}
return 0;
}
在理解了上述编程思路后,可以继续尝试解决POJ 3406问题“Last digit”。即输入整数n和m (1000000≥n≥m≥1),求组合数C(m,n)的最后一个非0数字。
.
将上面的“可Accepted的源程序3”的main函数改写为:
int main()
{
int last[4][4] ={{6,2,4,8},{1,3,9,7},{1,7,9,3},{1,9,1,9}};
int n,m,res=1,cnt2,cnt3,cnt5,cnt7,cnt9;
cin>>n>>m;
cnt2 = getFactor(n,2) - getFactor(n-m,2)- getFactor(m,2);
cnt5 = getFactor(n,5) - getFactor(n-m,5)- getFactor(m,5);
cnt3 = getLast(n,3) - getLast(n-m,3)- getLast(m,3);
cnt7 = getLast(n,7) - getLast(n-m,7)- getLast(m,7);
cnt9 = getLast(n,9) - getLast(n-m,9)- getLast(m,9);
if(cnt2<cnt5) res*=5;
else if(cnt2>cnt5) res*=last[0][(cnt2-cnt5)%4];
res*=last[1][(cnt3%4+4)%4]; // 考虑负数时的正向取模
res*=last[2][(cnt7%4+4)%4];
res*=last[3][(cnt9%4+4)%4];
cout<<res%10<<endl;
return 0;
}
提交给POJ网站,评判程序显示结果“Accepted”。