hdu 4669——Mutiples on a circle
2013-08-15 00:10
375 查看
http://www.cnblogs.com/GBRgbr/archive/2013/08/14/3256584.html
参考之。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<map> #include<set> #include<string> #include<cctype> #include<vector> #include<queue> using namespace std; #define maxn 55000 #define INF 10000000 #define LL __int64 int num[maxn]; int len[maxn]; int fac[maxn<<2]; int dp[maxn][300]; int n,k; void init() { fac[0]=1; for(int i=1;i<=n*3;i++) fac[i]=(fac[i-1]*10)%k; } int GetLen(int x) { int len=0; while(x) { len++; x/=10; } return len; } int main() { while(cin>>n>>k) { init(); for(int i=0;i<=n;i++) for(int j=0;j<=k;j++) dp[i][j]=0; for(int i=0;i<n;i++) { scanf("%d",&num[i]); len[i]=GetLen(num[i]); } num =num[0]; len =len[0]; int sum=0; int L=0; for(int i=n;i>0;i--) { sum=(num[i]*fac[L]+sum)%k; dp[0][sum]++; L+=len[i]; } LL ans=dp[0][0]; for(int i=1;i<n;i++) { for(int j=0;j<k;j++) dp[i][(j*fac[len[i]]+num[i])%k]+=dp[i-1][j]; sum=(sum*fac[len[i]]+num[i])%k; dp[i][num[i]%k]++; dp[i][sum]--; sum =((sum-num[i]*fac[L])%k+k)%k; ans+=dp[i][0]; } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- HDU 4669 Mutiples on a circle 数位DP
- HDU 4669 Mutiples on a circle(环状DP)
- HDU 4669 Mutiples on a circle 解题报告
- HDU 4669 Mutiples on a circle (环形数列DP)byPlato
- HDU 4669 Mutiples on a circle(DP)
- hdu 4669 Mutiples on a circle(按位DP)
- HDU 4669 Mutiples on a circle (DP , 统计)
- hdu 4669 Mutiples on a circle(高效)
- HDU 4669 Mutiples on a circle 动态规划
- hdu 4669 Mutiples on a circle
- HDU 4669 Mutiples on a circle (DP , 统计)
- HDU 4669 Mutiples on a circle (2013多校7 1004题)
- HDU 4669 Mutiples on a circle 不知道该归为哪一类。
- HDU - 4669 Mutiples on a circle
- HDU-4669 Mutiples on a circle 环形DP
- HDU 4669 Mutiples on a circle (2013多校联合7 1004)
- 2013 多校第七场 hdu 4669 Mutiples on a circle(DP,环)
- HDOJ 4669 Mutiples on a circle
- HDU 4665 Mutiples on a circle (圆环DP)
- HDU 4665 Mutiples on a circle (圆环DP)