hdu-4933-Miaomiao's Function(BC#4 1003)
来源:互联网 发布:c语言多线程函数 编辑:程序博客网 时间:2024/05/21 17:35
有的时候真是无力吐槽。。。G++ AC,C++ WA。这是什么心态。。。
这道题目耗费了半个小时写代码,却用了两天debug()........
dp[i][j][k]:
i为0||1,当i=0时代表L,i=1时代表R
第i状态下,数字j出现的次数为10^k次有多少种情况。
然后把i为1的剪掉i为0的。
然后算出最终的answer数组。
然后根据answer数组算出最后的f,这里有一个trick,当answer<0时,如果answer%9==0,那么f=9.因为当answer小于0时
算出的f大于0;
然后根据f算出最后的答案。。。
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <assert.h>#include<iostream>using namespace std;#define MAXN 10050#define LL __int64int dp[2][10][110];int num[110];void dos(char str[],int leap){ int n=strlen(str); for(int i=0;i<n;i++) { num[i+1]=str[i]-'0'; } if(leap==0) { if(n==1&&num[1]==0)return; num[n]--; int x=n; while(num[x]<0) { num[x]+=10; num[x-1]--; x--; } if(num[1]==0) { n--; for(int i=1;i<=n;i++) { num[i]=num[i+1]; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=9;j++) { int x=n-i; if(i!=1) { dp[leap][j][x]++; } for(int k=1;k+x+1<n;k++) { if(k%2)dp[leap][j][x+k-1]-=9; else dp[leap][j][x+k-1]+=9; } for(int k=1;k<i;k++) { if(i%2==0)dp[leap][j][n-k-1]-=(num[k]); else dp[leap][j][n-k-1]+=(num[k]); if(k==1) { if(i%2==0)dp[leap][j][n-k-1]-=(-1); else dp[leap][j][n-k-1]+=(-1); } } if(j>num[i])continue; if(j<num[i]) { if(i%2==0)dp[leap][j][x]-=1; else dp[leap][j][x]+=1; continue; } for(int k=i+1;k<=n;k++) { if(i%2==0)dp[leap][j][n-k]-=num[k]; else dp[leap][j][n-k]+=num[k]; if(k==n) { if(i%2==0)dp[leap][j][n-k]-=1; else dp[leap][j][n-k]+=1; } } if(i==n) { if(i%2==0)dp[leap][j][0]-=1; else dp[leap][j][0]+=1; } } }}void hebing(){ for(int i=0;i<=100;i++) { for(int j=1;j<=9;j++) { dp[0][j][i]=dp[1][j][i]-dp[0][j][i]; } }}int ans[220];int fuhao;int qian()//使用负数{ int len=0; for(int i=0;i<=100;i++) { int x=0; for(int j=1;j<=9;j++) { x+=dp[0][j][i]*j; } ans[i]=x; } int x=0; for(int i=0;i<=100;i++) { x=ans[i]; if(x!=0)len=i; else continue; if(x<0) { x=-x; ans[i]=x%10; ans[i]=-ans[i]; x=-x; } else ans[i]=x%10; ans[i+1]+=x/10; } while(x!=0) { len++; if(x<0) { x=-x; ans[len]=x%10; ans[len]=-ans[len]; x=-x; } else ans[len]=x%10; x=x/10; } while(ans[len]==0)len--; if(ans[len]<0)fuhao=0; else fuhao=1; if(fuhao==0) { for(int i=0;i<=len;i++)ans[i]=-ans[i]; } for(int i=0;i<=len;i++) { if(ans[i]<0) { while(ans[i]<0) { ans[i]+=10; ans[i+1]--; } } } if(fuhao==0) { for(int i=0;i<=len;i++)ans[i]=-ans[i]; } return len;}int getf(int len){ int x=0; int y=0; for(int i=0;i<=len;i++) { x+=ans[i]; y=y*10-ans[i]; y=y%9; } if(fuhao==0) { y=-y; while(y<=0)y+=9; return y; } while(x>=10) { int y=0; while(x) { y+=x%10; x=x/10; } x=y; } return x;}void out(int f,int len){ int aa=0; int y=0; for(int i=len;i>=0;i--) { aa=aa*10+ans[i]; aa=aa%f; y=y*10-ans[i]; y=y%f; } if(fuhao==0) { y=-y; cout<<(y%f+f)%f<<endl; return; } aa=(aa+f)%f; cout<<aa<<endl;}char stl[110];char str[110];int main(){ int T,n; scanf("%d",&T); while(T--) { memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); scanf("%s%s",stl,str); dos(stl,0); dos(str,1); hebing(); int len=qian(); LL f=getf(len); if(f==0) { cout<<"Error!"<<endl; } else { out(f,len); } } return 0;}
1 0
- hdu-4933-Miaomiao's Function(BC#4 1003)
- HDU 4933 / BC 4C Miaomiao's Functiong
- HDU 4933 Miaomiao's Function 数位DP
- HDU 4932/BC 4B Miaomiao's Geometry
- [hdu 4933]Miaomiao's Function 数位DP+大数
- 【DP】 HDOJ 4933 Miaomiao's Function
- 【CUGBACM15级BC第四场 B】hdu 4932 Miaomiao's Geometry
- HDU 4932 Miaomiao's Geometry
- hdu 4932 Miaomiao's Geometry
- HDU 4932 Miaomiao's Geometry
- HDU-4932-Miaomiao's Geometry
- hdu 4932 Miaomiao's Geometry
- HDU 4932 Miaomiao's Geometry
- HDU-4932-Miaomiao's Geometry
- hdu 4932Miaomiao's Geometry
- HDU 4932 Miaomiao's Geometry
- [BestCoder Round #4] hdu 4932 Miaomiao's Geometry (贪心)
- hdu 4932 Miaomiao's Geometry(BestCoder Round#4)
- 每天一个linux命令:find命令
- Vi 配置
- jQuery EasyUI扩展:validatebox实现多重规则验证
- HttpLive切片指令
- C++Vector用法 .
- hdu-4933-Miaomiao's Function(BC#4 1003)
- S3C2440上触摸屏驱动实例开发讲解(转)
- ZOJ1655Transport Goods Dijkstra
- 黑马程序员-集合框架
- Python模块结构和布局
- 杭电 1698 Just a Hook(线段树区间修改)
- css 过渡效果
- 【Thinking in java】对象导论
- 2014华为机试题5:回文数