P1006:模拟

然而我的同余方程能过样例然而就是WA⊙﹏⊙b

【已查明:扩展欧几里得算法出了很隐蔽的问题】

 int exGcd(int x,int y,int& a,int& b) //ax+by=gcd(x,y)
 {
     ; b=; return x; }
     int res=exGcd(y,x%y,a,b);
     int t=a; a=b; b=t-x/y*b;
     return res;
 }

Correct exGcd Code

 #include <cstdio>
 #include <cstring>
 #include <algorithm>

 inline int code(char x)
 {
     switch(x)
     {
     ;
     ;
     ;
     }
 }

 inline char decode(int x)
 {
     switch(x)
     {
      : return '_';
     : return '.';
     ;
     }
 }

 int K;
 ;
 ;

 char cpt[maxL];

 bool input()
 {
     scanf("%d",&K);
     if(!K) return false;
     return scanf("%s",cpt);
 }

 int exGcd(int x,int y,int& a,int& b) //ax+by=gcd(x,y)
 {
     ; b=; return x; }
     int res=exGcd(y,x%y,a,b);
     int t=a; a=b; b=t-b*x/y;
     return res;
 }

 int mdEq(int a,int b,int m) //ax=b(mod m)
 {
     //let ax+km=b
     int x,k;
     int g=exGcd(a,m,x,k);
     x*=(b/g); x%=m;
     ?x+m:x;
 }

 void solve()
 {
     int l=strlen(cpt);
     ;j<l;j++)
     {
         int i=mdEq(K,j,l);
         putchar(decode((i+code(cpt[i]))%apb));
     }
     putchar('\n');
 }

 int main()
 {
     while(input()) solve();
     ;
 }

Problem:ZOJ P1006 WA

P1008:DFS,迷之TLE*2
 #include <cstdio>
 #include <cstring>
 #include <algorithm>

 ],down[],left[],right[];
 ];
 ];
 int N,Ns;

 bool input()
 {
     scanf("%d",&N); Ns=N*N;
     if(!N) return false;
     ;i<=Ns;i++)
         scanf("%d%d%d%d",up+i,right+i,down+i,left+i);
     return true;
 }

 bool move(int,int);
 bool dfs(int);

 inline bool move(int cur,int i)
 {
     used[i]=true;
     fill[cur]=i;
     )) return true;
     used[i]=false;
     return false;
 }

 bool dfs(int cur)
 {
     ) return true;
     bool res=false;
     ;
     ;
     ) st|=;
     ;i<=Ns;i++)
         if(!used[i])
         {
             )
             {
                 res=move(cur,i);
                 if(res) return true;
             }
             )
             {
                 int& u=fill[cur-N];
                 if(up[i]==down[u])
                 {
                     res=move(cur,i);
                     if(res) return true;
                 }
             }
             )
             {
                 ];
                 if(left[i]==right[l])
                 {
                     res=move(cur,i);
                     if(res) return true;
                 }
             }
             else
             {
                 int& u=fill[cur-N];
                 ];
                 if(left[i]==right[l] && up[i]==down[u])
                 {
                     res=move(cur,i);
                     if(res) return true;
                 }
             }
         }
     return false;
 }

 int main()
 {
     );
     freopen("t.in","r",stdin);
     while(input())
     {
         ++cs;
         ) printf("\n");
         memset(used,,sizeof(used));
         printf()?"Possible":"Inpossible");
     }
     ;
 }

Problem:ZOJ P1008

P2672:DP+Hash优化转移

然而谁**能告诉我为啥会TLE!!( >﹏<。)

 #include <cstdio>
 #include <cstring>
 #include <algorithm>

 #include <list>

 struct Hash
 {
     int val;
     int pos;

     Hash(int v,int p):val(v),pos(p) {}
 };

 ;
 ;

 std::list<Hash> hash[dv+];

 typedef std::list<Hash>::iterator Iter;
 Iter x;

 int N;
 int arr[maxN];
 short dp[maxN][maxN];

 inline void insertHash(int v,int p)
 {
     hash[v&dv].push_back(Hash(v,p));
 }

 inline int findHash(int v,int p)
 {
     int res=maxN;
     for(x=hash[v&dv].begin();x!=hash[v&dv].end();++x)
         if(x->val == v && x->pos > p && x->pos < res)
             res=x->pos;
      : res ;
 }

 void init()
 {
     ;i<=dv;i++) hash[i].clear();
     ;i<=N;i++) insertHash(arr[i],i);
 }

 bool input()
 {
     if(scanf("%d",&N)==EOF) return false;
     ;i<=N;i++) scanf("%d",arr+i);
     return true;
 }

 void __solve()
 {
     init();
     ;
     int s,t;

     ;i<N;i++) dp[i][N]=;
     ;j>;j--)
         ;i;i--)
         {
             int f=findHash(arr[j]+arr[i],j);
             ) dp[i][j]=;
             ) > ans)
             {
                 ans=dp[i][j];
                 s=i; t=j;
             }
         }

     printf("%d\n%d %d ",ans,arr[s],arr[t]);
     int f;
     )
     {
         printf("%d ",arr[f]);
         s=t; t=f;
     }
     printf("\n\n");
 }

 void solve()
 {
     ) printf(]);
     ) printf(],arr[]);
     else __solve();
 }

 #include <ctime>

 int main()
 {
     while(input()) solve();
     ;
 }

Problem:ZOJ P2672 TLE

P3300:迷之WA

 #include <cstdio>
 #include <cstring>
 #include <algorithm>

 ];

 bool input()
 {
     int v;
     if(scanf("%d",&v)==EOF) return false;
     memset(cnt,,sizeof(cnt));
     ++cnt[v];
     ;i<=;i++)
     {
         scanf("%d",&v);
         ++cnt[v];
     }
     return true;
 }

 bool dfs(int eye)
 {
     bool res=true;
     ;i<=;i++) if(cnt[i]) { res=false; break; }
     if(res) return true;
     ;i<=;i++)
         ] && cnt[i+])
         {
             --cnt[i]; --cnt[i+]; --cnt[i+];
             res|=dfs(eye);
             if(res) return true;
             ++cnt[i]; ++cnt[i+]; ++cnt[i+];
         }
     ;i<=;i++)
         )
         {
             cnt[i]-=;
             res|=dfs(eye);
             if(res) return true;
             cnt[i]+=;
         }
     if(!eye) {
         ;i<=;i++)
         )
         {
             cnt[i]-=;
             res|=dfs(eye+);
             if(res) return true;
             cnt[i]+=;
         }
     }
     return res;
 }

 void solve()
 {
     ;
     ;i<=;i++)
     {
         ) ++cnt[i];
         else continue;
         ))
         {
             if(ok++) printf(" %d",i);
             else printf("%d",i);
         }
         --cnt[i];
     }
     printf("\n");
 }

 int main()
 {
     while(input()) solve();
     ;
 }

Problem:ZOJ P3300 WA

05-06 00:45