hdu 4933 孙子定理+数位dp
来源:互联网 发布:普通java项目编译运行 编辑:程序博客网 时间:2024/05/17 02:33
//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[N],str2[N];node dp[N][2][2],dp2[N][2][2][T];bool vis[N][2][2],vis2[N][2][2][T];int num[N],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[N],str2[N];node dp[N][3][10],dp2[N][3][T];//0 all 0//1 +//2 -bool vis[N][3][10],vis2[N][3][T];int num[N],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();}
0 0
- hdu 4933 孙子定理+数位dp
- hdu 1573 孙子定理
- 孙子定理
- 孙子定理
- HDU 3579 Hello Kiki 数论-(孙子定理)
- HDU - 1573 X问题 && POJ - 1891 (孙子定理)
- HDU 4933 Miaomiao's Function 数位DP
- hdu 3555 数位dp
- hdu 3555 数位dp
- HDU 3652 数位DP
- HDU 3555 数位DP
- HDU 3555 \数位DP
- HDU 2089 数位DP
- hdu 3555 数位DP
- hdu 3709 数位DP
- hdu 4352 数位DP
- HDU 3886 数位DP
- HDU 3555 数位DP
- ajax
- MATLAB如何定义函数
- 自由操控声音-相位声码器-变速篇(二)
- hdu 1711 Number Sequence(KMP)
- zoj 1655 最短路 Transport Goods
- hdu 4933 孙子定理+数位dp
- shell 字符串处理
- hdu 1181 变形课
- 母函数系列之找单词 hdoj 2082
- mac 同时安装多个版本的JDK
- java 获取控制台的输入的两个方法
- GNU Parallel
- a new Webcam Api Tutorial in C++ for Windows(Windows Media Foundation)--WMF
- 多线程例子