hdu 4933 孙子定理+数位dp
2014-08-11 20:01
411 查看
//code 1 //dp[2][2] //mod 2520(9*8*7*5) //anss=anss%(anss%9); #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cstdlib> #include <cmath> #include <queue> #include <vector> #include <map> #define pb push_back #define mp make_pair #define eps 1e-9 #define zero(x) (fabs(x)<eps) #define pi acos(-1.0) #define f1 first #define f2 second #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define initial 1,n,1 #define N 105 #define T 15 #define clr(x,y) memset(x,y,sizeof(x)) const int inf=0x3f3f3f3f; const long long INF=1LL<<50; using namespace std; typedef long long LL; typedef pair <int, int> PII; template<typename X> inline bool minimize(X&p,X q){if(p<=q)return 0;p=q;return 1;} template<typename X> inline bool maximize(X&p,X q){if(p>=q)return 0;p=q;return 1;} struct node{ int n,s; node(int x=0,int y=0):n(x),s(y){} }; char str1 ,str2 ; node dp [2][2],dp2 [2][2][T]; bool vis [2][2],vis2 [2][2][T]; int num ,len,id,l2; const int mod=2520; int mod2[T]={7000003,7000009,7000033,7000057,7000061, 7000069,7000087,7000109,7000121,7000127, 7000129,7000157,7000163,7000171,7000181}; node dfs(int w,int se,int flag) { if (w==0) return node(1,0); if (!se&&vis[w][l2][flag]) return dp[w][l2][flag] ; int max=se?num[w]:9; node tmp,re; int rr; for (int i=0;i<=max;i++) { if (flag&&i) rr=((len-w)%2==0)?1:-1; else rr=1; tmp=dfs(w-1,se&&(i==max),flag&&(i==0)); re.s+=i*tmp.n*rr; re.s-=tmp.s*rr; re.n+=tmp.n; } re.s%=mod; re.n%=mod; if (!se) { vis[w][l2][flag]=1; dp[w][l2][flag]=re; } return re; } node dfs2(int w,int se,int flag) { if (w==0) return node(1,0); if (!se&&vis2[w][l2][flag][id]) return dp2[w][l2][flag][id]; int max=se?num[w]:9; node tmp,re; int rr; for (int i=0;i<=max;i++) { if (flag&&i) rr=((len-w)%2==0)?1:-1; else rr=1; tmp=dfs2(w-1,se&&(i==max),flag&&(i==0)); re.s+=i*tmp.n*rr; re.s-=tmp.s*rr; re.n+=tmp.n; } re.s%=mod2[id]; re.n%=mod2[id]; if (!se) { vis2[w][l2][flag][id]=1; dp2[w][l2][flag][id]=re; } return re; } int calc(char*s,int ff,int gg) { len=strlen(s); if (len==1&&s[0]=='0'&&ff==1) return 0; for (int i=1;i<=len;i++) num[i]=s[len-i]-'0'; if (ff){ num[1]--; int i=1; while (num[i]<0) {num[i]+=10; num[i+1]--; i++;} if (!num[len]&&len>1) len--; } l2=len%2; if (!gg)return dfs(len,1,1).s; return dfs2(len,1,1).s; } void doit() { int ans2,ans1,anss; scanf("%s",str1); scanf("%s",str2); int ff=0; for (int i=0;i<T;i++) { id=i; ans2=calc(str2,0,1); ans1=calc(str1,1,1); anss=(ans2-ans1+mod2[i])%mod2[i]; if (anss) {ff=1; break;} } if (!ff) {printf("Error!\n"); return;} ans2=calc(str2,0,0); ans1=calc(str1,1,0); anss=(ans2-ans1+mod)%mod; if (anss%9==0) {printf("0\n"); return;} anss=anss%(anss%9); printf("%d\n",anss); } int main() { memset(vis,0,sizeof(vis)); memset(vis2,0,sizeof(vis2)); int cas; scanf("%d",&cas); while (cas--) doit(); }
//code 2 //dp[3] //anss=mod 9; //finalans=mod anss; #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cstdlib> #include <cmath> #include <queue> #include <vector> #include <map> #define pb push_back #define mp make_pair #define eps 1e-9 #define zero(x) (fabs(x)<eps) #define pi acos(-1.0) #define f1 first #define f2 second #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define initial 1,n,1 #define N 105 #define T 15 #define clr(x,y) memset(x,y,sizeof(x)) const int inf=0x3f3f3f3f; const long long INF=1LL<<50; using namespace std; typedef long long LL; typedef pair <int, int> PII; template<typename X> inline bool minimize(X&p,X q){if(p<=q)return 0;p=q;return 1;} template<typename X> inline bool maximize(X&p,X q){if(p>=q)return 0;p=q;return 1;} struct node{ int n,s; node(int x=0,int y=0):n(x),s(y){} }; char str1 ,str2 ; node dp [3][10],dp2 [3][T]; //0 all 0 //1 + //2 - bool vis [3][10],vis2 [3][T]; int num ,len,id,fid; int mod; int mod2[T]={7000003,7000009,7000033,7000057,7000061, 7000069,7000087,7000109,7000121,7000127, 7000129,7000157,7000163,7000171,7000181}; node dfs(int w,int flag,int se) { if (w==0) return node(1,0); if (!se&&vis[w][flag][mod]) return dp[w][flag][mod]; int max=se?num[w]:9; node tmp,re; for (int i=0;i<=max;i++) { if (flag) { tmp=dfs(w-1,3-flag,se&&(i==max)); if (flag==2) re.s-=tmp.n*i; else re.s+=tmp.n*i; } else{ if (i==0) tmp=dfs(w-1,0,se&&(i==max));else tmp=dfs(w-1,2,se&&(i==max)); re.s+=tmp.n*i; } re.n+=tmp.n; re.s+=tmp.s; } re.n%=mod; re.s%=mod; if (!se) { vis[w][flag][mod]=1; dp[w][flag][mod]=re; } return re; } node dfs2(int w,int flag,int se) { if (w==0) return node(1,0); if (!se&&vis2[w][flag][id]) return dp2[w][flag][id]; int max=se?num[w]:9; node tmp,re; for (int i=0;i<=max;i++) { if (flag) { tmp=dfs2(w-1,3-flag,se&&(i==max)); if (flag==2) re.s-=tmp.n*i; else re.s+=tmp.n*i; } else{ if (i==0) tmp=dfs2(w-1,0,se&&(i==max));else tmp=dfs2(w-1,2,se&&(i==max)); re.s+=tmp.n*i; } re.n+=tmp.n; re.s+=tmp.s; } re.n%=mod2[id]; re.s%=mod2[id]; if (!se) { vis2[w][flag][id]=1; dp2[w][flag][id]=re; } return re; } int calc(char*s,int ff,int gg) { len=strlen(s); if (len==1&&s[0]=='0'&&ff==1) return 0; for (int i=1;i<=len;i++) num[i]=s[len-i]-'0'; if (ff){ num[1]--; int i=1; while (num[i]<0) {num[i]+=10; num[i+1]--; i++;} if (!num[len]&&len>1) len--; } if (!gg)return dfs(len,0,1).s; return dfs2(len,0,1).s; } void doit() { int ans2,ans1,anss; scanf("%s",str1); scanf("%s",str2); int ff=0; for (int i=0;i<T;i++) { id=i; ans2=calc(str2,0,1); ans1=calc(str1,1,1); anss=(ans2-ans1+mod2[i])%mod2[i]; if (anss) {ff=1; break;} } if (!ff) {printf("Error!\n"); return;} mod=9; ans2=calc(str2,0,0); ans1=calc(str1,1,0); anss=(ans2-ans1+mod)%mod; if (anss==0) {printf("0\n"); return;} mod=anss; ans2=calc(str2,0,0); ans1=calc(str1,1,0); anss=(ans2-ans1+mod)%mod; printf("%d\n",anss); } int main() { memset(vis,0,sizeof(vis)); memset(vis2,0,sizeof(vis2)); int cas; scanf("%d",&cas); while (cas--) doit(); }
相关文章推荐
- HDU 4933 Miaomiao's Function 数位DP
- hdu 3555 数位DP
- hdu 3555 数位dp
- HDU 4389 X mod f(x) [数位DP]
- HDU-3555 Bomb 数位DP
- HDU 3652 数位DP
- 多校第6场 HDU 3893&&JLU Drawing Pictures(数位DP变形,矩阵连乘)
- HDU 3652 3555 数位dp
- HDU 3271 SNIBB [数位DP]
- hdu 3652(数位dp)
- HDU 4507 数位dp
- hdu 3555 Bomb【数位DP】
- HDU 3555 Bomb (数位DP)
- HDU-3555 Bomb 数位DP
- HDU 3555 Bomb(数位DP)
- hdu 3555 - Bomb [数位dp]
- HDU_3709 Balanced Number 数位dp
- HDU 4389 X mod f(x)[数位统计dp]
- hdu 3555 Bomb 数位DP
- HDU 3709 ZJU 3416 Balanced Number 数位dp 记忆搜索