令\(dis_i\)表示最小的符合\((\sum\limits_{i=1}^{n}a_ix_i)\space mod\space
a_k=i(\forall k \in[1.n])\)的\(\sum\limits_{i=1}^{n}a_ix_i\), 则\(i+t\cdot a_k,\forall t \in
\mathbb{N}\)都有解。
\(\forall i \in [0,a_k)\),\(\forall j\in[1,n],j\neq k\)建边\((i,(i+a_j)mod\space a_k)\),边权为\(a_j\), 从0开始跑最短路可求\(dis_i\),\(a_k\)取\(a_1...a_n\)中最小的可保证建边最少运行最快。
intdfs(int pos,int pre,int sta,bool lim){ //pos:position [0,n) //pre:previous selected number //sta:status, it means pre==6 in this problem //lim:limitation, it means if the i-th numbers before pos are all a[i] or not if(pos==-1){//the number 0 return1; } if(!lim&&dp[sta][pos]!=-1){//memorization return dp[sta][pos]; } int rg=lim?a[pos]:9,tmp=0; for(int i=0;i<=rg;++i){ if(pre==6&&i==2) continue; if(i==4) continue; tmp+=dfs(pos-1,i,i==6,lim&&i==a[pos]); } if(!lim) dp[sta][pos]=tmp; return tmp; }
intsolve(int x){ int pos=0; while(x){ a[pos++]=x%10; x/=10; } returndfs(pos-1,-1,0,1); }
intmain(){ int l,r; while(~scanf("%d%d",&l,&r)&&l+r){ memset(dp,-1,sizeof dp); printf("%d\n",solve(r)-solve(l-1)); } return0; }
n=int(input()) n=n+1 a=[[0for i inrange(n+2)]for j inrange(n+2)] a[1][1]=n-1 a[2][n]=-1 a[n][2]=-1 for i inrange(2,n+1): a[i][1]=-1 a[1][i]=-1 a[i][i]=3 if i+1<=n : a[i][i+1]=-1 a[i+1][i]=-1 ans=1 for i inrange(1,n): for j inrange(i+1,n): while a[j][i]!=0: t=a[i][i]//a[j][i] for k inrange(i,n): a[i][k]-=t*a[j][k] a[i][k],a[j][k]=a[j][k],a[i][k] ans=-ans ans*=a[i][i] print(ans)