zoukankan      html  css  js  c++  java
  • 第五周 8.16-8.22

    8.16

    补BC。

    HDU 5391 Zball in Tina Town

    求(n-1)!%n。

    首先合数的话前面必然有它的因子。所以是0。

    质数我打表才发现是n-1。

    然而有一个著名的威尔逊定理(渣根本没听过。

    坑在于n=4时是2。没判就死了QAQ。

     1 # include <iostream>
     2 # include <cstdio>
     3 using namespace std;
     4 typedef long long LL;
     5 
     6 LL qpow(int a,int b,int r)
     7 {
     8     LL ans=1,buff=a;
     9     while(b)
    10     {
    11         if(b&1)ans=(ans*buff)%r;
    12         buff=(buff*buff)%r;
    13         b>>=1;
    14     }
    15     return ans;
    16 }
    17 
    18 bool Miller_Rabbin(int n,int a)
    19 {
    20     int r=0,s=n-1,j;
    21     if(!(n%a))
    22         return false;
    23     while(!(s&1)){
    24         s>>=1;
    25         r++;
    26     }
    27     LL k=qpow(a,s,n);
    28     if(k==1)
    29         return true;
    30     for(j=0;j<r;j++,k=k*k%n)
    31         if(k==n-1)
    32             return true;
    33     return false;
    34 }
    35 
    36 bool IsPrime(int n)
    37 {
    38     int tab[]={2,3,5,7};
    39     for(int i=0;i<4;i++)
    40     {
    41         if(n==tab[i])
    42             return true;
    43         if(!Miller_Rabbin(n,tab[i]))
    44             return false;
    45     }
    46     return true;
    47 }
    48 
    49 int main(void)
    50 {
    51     int T; cin>>T;
    52     while(T--)
    53     {
    54         int n; scanf("%d",&n);
    55         if(n==4) printf("2
    ");
    56         else if(!IsPrime(n)) printf("0
    ");
    57         else printf("%d
    ",n-1);
    58     }
    59     return 0;
    60 }
    Aguin

    HDU 5392 Infoplane in Tina Town

    这个题我真不知道怎么回事……

    按题解应该是先筛个表。

    搞个输入挂读数据。

    再求循环节。记素因子。

    最后乘起来。快速幂取模。

    原本时限是3.5s。现在开到7s了。

    然而这样还是T。发现有人没有筛没有输入挂没有快速幂过了。

    然后我把除了快速幂的全去了。就过了。5-6s。

    不知道那些菊苣是怎么2s过的。ymymym。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 using namespace std;
     6 typedef long long LL;
     7 # define maxn 3000100
     8 const LL mod=(LL)3*(1<<30)+(LL)1;
     9 int a[maxn],vis[maxn],mark[maxn];
    10 
    11 LL qpow(LL a,LL b)
    12 {
    13     LL d=1,t=a;
    14     while(b)
    15     {
    16         if(b%2) d=(d*t)%mod;
    17         b/=2;
    18         t=(t*t)%mod;
    19     }
    20     return d;
    21 }
    22 
    23 int main(void)
    24 {
    25     int T; cin>>T;
    26     while(T--)
    27     {
    28         memset(vis,0,sizeof(vis));
    29         memset(mark,0,sizeof(mark));
    30         int n; scanf("%d",&n);
    31         for(int i=1;i<=n;i++) scanf("%d",a+i);
    32         for(int i=1;i<=n;i++)
    33         {
    34             if(vis[i]) continue;
    35             int pos=i,cnt=0;
    36             while(!vis[pos])
    37             {
    38                 cnt++;
    39                 vis[pos]=1;
    40                 pos=a[pos];
    41             }
    42             for(int j=2;cnt>1;j++)
    43             {
    44                 int t=0;
    45                 while(cnt%j==0){cnt/=j;t++;}
    46                 mark[j]=max(mark[j],t);
    47             }
    48         }
    49         LL ans=1;
    50         for(int i=0;i<=n;i++) if(mark[i]) ans=(ans*qpow(i,mark[i]))%mod;
    51         printf("%I64d
    ",ans);
    52     }
    53     return 0;
    54 }
    Aguin

    后面用到的数学略多跪了。我还是先切完菜。 

    UVA 11624 Fire!

    一次BFS。先加火节点。再加人节点。

    注意墙。人。火要用不同标记。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <queue>
     4 using namespace std;
     5 typedef pair<int,int> pii;
     6 typedef pair<pii,int> piii;
     7 int R,C,map[1001][1001];
     8 int step[][2]={{0,1},{0,-1},{1,0},{-1,0}};
     9 queue <piii> q;
    10 
    11 bool in(int i,int j)
    12 {
    13     return i>0&&i<=R&&j>0&&j<=C;
    14 }
    15 
    16 int main(void)
    17 {
    18     int T; cin>>T;
    19     while(T--)
    20     {
    21         scanf("%d%d",&R,&C);
    22         while(!q.empty()) q.pop();
    23         pii J;
    24         for(int i=1;i<=R;i++)
    25         {
    26             char s[1005];
    27             scanf("%s",s+1);
    28             for(int j=1;j<=C;j++)
    29             {
    30                 if(s[j]=='#') map[i][j]=2;
    31                 else if(s[j]=='J'){J=pii(i,j);map[i][j]=-1;}
    32                 else if(s[j]=='F'){q.push(piii(pii(i,j),-1));map[i][j]=1;}
    33                 else map[i][j]=0;
    34             }
    35         }
    36         q.push(piii(J,0));
    37         int ans=-1;
    38         while(!q.empty())
    39         {
    40             piii tem=q.front();q.pop();
    41             pii cor=tem.first;
    42             int x=cor.first,y=cor.second,t=tem.second;
    43             if(t<0)
    44             {
    45                 for(int i=0;i<4;i++)
    46                 {
    47                     int xx=x+step[i][0],yy=y+step[i][1];
    48                     if(!in(xx,yy)||map[xx][yy]>0) continue;
    49                     q.push(piii(pii(xx,yy),-1));
    50                     map[xx][yy]=1;
    51                 }
    52             }
    53             else
    54             {
    55                 for(int i=0;i<4;i++)
    56                 {
    57                     int xx=x+step[i][0],yy=y+step[i][1];
    58                     if(!in(xx,yy)) {ans=t+1;break;}
    59                     if(map[xx][yy]) continue;
    60                     q.push(piii(pii(xx,yy),t+1));
    61                     map[xx][yy]=-1;
    62                 }
    63                 if(ans>0) break;
    64             }
    65         }
    66         if(ans>0) printf("%d
    ",ans);
    67         else puts("IMPOSSIBLE");
    68     }
    69     return 0;
    70 }
    Aguin

    8.17

    POJ 3984 迷宫问题

    水水BFS。保存路径。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <queue>
     4 using namespace std;
     5 typedef pair<int,int> pii;
     6 int map[5][5],step[][2]={{0,1},{0,-1},{1,0},{-1,0}};
     7 pii pre[5][5];
     8 queue <pii> q;
     9 
    10 bool in(int i,int j)
    11 {
    12     return i>=0&&i<5&&j>=0&&j<5;
    13 }
    14 
    15 void ans_print(pii cor)
    16 {
    17     int x=cor.first,y=cor.second;
    18     if(x||y) ans_print(pre[x][y]);
    19     printf("(%d, %d)
    ",x,y);
    20     return;
    21 }
    22 
    23 int main(void)
    24 {
    25     for(int i=0;i<5;i++)
    26         for(int j=0;j<5;j++)
    27             scanf("%d",&map[i][j]);
    28     q.push(pii(0,0));
    29     while(!q.empty())
    30     {
    31         pii cor=q.front(); q.pop();
    32         int x=cor.first,y=cor.second;
    33         if(x==4&&y==4) {ans_print(cor); break;}
    34         for(int i=0;i<4;i++)
    35         {
    36             int xx=x+step[i][0],yy=y+step[i][1];
    37             if(!in(xx,yy)||map[xx][yy]) continue;
    38             map[xx][yy]=1;
    39             pre[xx][yy]=cor;
    40             q.push(pii(xx,yy));
    41         }
    42     }
    43     return 0;
    44 }
    Aguin

    Gym - 100286B Blind Walk

    水水DFS。但是第一次那么有趣的IO。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <string>
     4 # include <cstring>
     5 using namespace std;
     6 int x,y,map[100][100];
     7 string a[]={"NORTH","SOUTH","WEST","EAST"};
     8 int step[][2]={{1,0},{-1,0},{0,-1},{0,1}};
     9 
    10 void dfs(void)
    11 {
    12     string res;
    13     for(int i=0;i<4;i++)
    14     {
    15         if(map[x+step[i][0]][y+step[i][1]]) continue;
    16         x+=step[i][0];
    17         y+=step[i][1];
    18         map[x][y]=1;
    19         cout<<a[i]<<endl;
    20         cin>>res;
    21         if(res[0]=='E')
    22         {
    23             dfs();
    24             cout<<a[i^1]<<endl;
    25             cin>>res;
    26         }
    27         x-=step[i][0];
    28         y-=step[i][1];
    29     }
    30     return;
    31 }
    32 
    33 int main(void)
    34 {
    35     x=y=50;
    36     map[50][50]=1;
    37     dfs();
    38     cout<<"DONE"<<endl;
    39     return 0;
    40 }
    Aguin

    Gym - 100286H Hell on the Markets

    和多校一个数字分组很像。但是这个可以贪。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <algorithm>
     4 using namespace std;
     5 typedef long long LL;
     6 
     7 struct node
     8 {
     9     int id,num,ans;
    10 }a[100010];
    11 
    12 bool cmp1(node x,node y)
    13 {
    14     return x.num<y.num;
    15 }
    16 
    17 bool cmp2(node x,node y)
    18 {
    19     return x.id<y.id;
    20 }
    21 
    22 int main(void)
    23 {
    24     freopen("hell.in","r",stdin);
    25     freopen("hell.out","w",stdout);
    26     int n; 
    27     while(~scanf("%d",&n))
    28     {
    29         LL sum=0;
    30         for(int i=1;i<=n;i++)
    31         {
    32             scanf("%d",&a[i].num);
    33             sum+=(LL)a[i].num;
    34             a[i].ans=1;
    35             a[i].id=i;
    36         }
    37         if(sum%2){puts("No");continue;}
    38         LL each=sum/2,tot=0;
    39         sort(a+1,a+1+n,cmp1);
    40         for(int i=n;i>0;i--)
    41         {
    42             if(tot+(LL)a[i].num<=each)
    43             {
    44                 a[i].ans=-1;
    45                 tot+=(LL)a[i].num;
    46             }
    47         }
    48         sort(a+1,a+1+n,cmp2);
    49         printf("Yes
    ");
    50         for(int i=1;i<=n;i++) printf("%d ",a[i].ans);
    51         printf("
    ");
    52     }
    53     return 0;
    54 }
    Aguin

    HDU 1241 Oil Deposits

    这不是紫薯题吗- -。

     1 # include <iostream>
     2 # include <cstdio>
     3 using namespace std;
     4 char map[101][101];
     5 int m,n;
     6 
     7 bool in(int i,int j)
     8 {
     9     return i>0&&i<=m&&j>0&&j<=n;
    10 }
    11 
    12 void dfs(int x,int y)
    13 {
    14     map[x][y]='*';
    15     for(int i=-1;i<2;i++)
    16         for(int j=-1;j<2;j++)
    17             if((i||j)&&in(x+i,y+j)&&map[x+i][y+j]=='@')
    18                 dfs(x+i,y+j);
    19     return;
    20 }
    21 
    22 int main(void)
    23 {
    24     while(~scanf("%d%d",&m,&n))
    25     {
    26         if(!m) break;
    27         for(int i=1;i<=m;i++)
    28             scanf("%s",&map[i][1]);
    29         int ans=0;
    30         for(int i=1;i<=m;i++)
    31             for(int j=1;j<=n;j++)
    32                 if(map[i][j]=='@')
    33                     {dfs(i,j);ans++;}
    34         printf("%d
    ",ans);
    35     }
    36     return 0;
    37 }
    Aguin

    HDU 1495 非常可乐

    水水BFS。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <queue>
     5 using namespace std;
     6 typedef pair<int,int> pii;
     7 typedef pair<pii,int> piii;
     8 int vol[101][101];
     9 queue<piii> q;
    10 
    11 int main(void)
    12 {
    13     int S,N,M;
    14     while(~scanf("%d%d%d",&S,&N,&M))
    15     {
    16         memset(vol,0,sizeof(vol));
    17         if(!S) break;
    18         if(S%2) {puts("NO"); continue;}
    19         while(!q.empty()) q.pop();
    20         vol[0][0]=1;
    21         q.push(piii(pii(0,0),0));
    22         int ans=-1;
    23         while(!q.empty())
    24         {
    25             piii tem=q.front(); q.pop();
    26             pii v=tem.first;
    27             int v1=v.first,v2=v.second,t=tem.second;
    28             if((v1==S/2&&v2==S/2)||(v1==0&&v2==S/2)||(v1==S/2&&v2==0)){ans=t; break;}
    29             if(!vol[v1][0])
    30             {
    31                 vol[v1][0]=1;
    32                 q.push(piii(pii(v1,0),t+1));
    33             }
    34             if(!vol[0][v2])
    35             {
    36                 vol[0][v2]=1;
    37                 q.push(piii(pii(0,v2),t+1));
    38             }
    39             if(!vol[N][v2])
    40             {
    41                 vol[N][v2]=1;
    42                 q.push(piii(pii(N,v2),t+1));
    43             }
    44             if(!vol[v1][M])
    45             {
    46                 vol[v1][M]=1;
    47                 q.push(piii(pii(v1,M),t+1));
    48             }
    49             if(v1+v2>N&&!vol[N][v1+v2-N])
    50             {
    51                 vol[N][v1+v2-N]=1;
    52                 q.push(piii(pii(N,v1+v2-N),t+1));
    53             }
    54             if(v1+v2<=N&&!vol[v1+v2][0])
    55             {
    56                 vol[v1+v2][0]=1;
    57                 q.push(piii(pii(v1+v2,0),t+1));
    58             }
    59             if(v1+v2>M&&!vol[v1+v2-M][M])
    60             {
    61                 vol[v1+v2-M][M]=1;
    62                 q.push(piii(pii(v1+v2-M,M),t+1));
    63             }
    64             if(v1+v2<=M&&!vol[0][v1+v2])
    65             {
    66                 vol[0][v1+v2]=1;
    67                 q.push(piii(pii(0,v1+v2),t+1));
    68             }
    69         }
    70         if(ans<0) {puts("NO");continue;}
    71         else printf("%d
    ",ans);
    72     }
    73     return 0;
    74 }
    Aguin

    8.18

    HDU 2612 Find a way

    水水BFS。

    小坑在于有的KFC是无人能到的。记得剔除。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <vector>
     5 # include <queue>
     6 using namespace std;
     7 typedef pair<int,int> pii;
     8 typedef pair<pii,int> piii;
     9 int n,m,map[201][201],cpy[201][201],time[201][201];
    10 int step[][2]={{0,1},{0,-1},{1,0},{-1,0}};
    11 vector<pii> KFC;
    12 queue<piii> q;
    13 
    14 bool in(int i,int j)
    15 {
    16     return i&&i<=n&&j&&j<=m;
    17 }
    18 
    19 void bfs(pii p)
    20 {
    21     memcpy(cpy,map,sizeof(cpy));
    22     while(!q.empty()) q.pop();
    23     q.push(piii(p,0));
    24     while(!q.empty())
    25     {
    26         piii tem=q.front(); q.pop();
    27         pii cor=tem.first;
    28         int x=cor.first,y=cor.second,t=tem.second;
    29         for(int i=0;i<4;i++)
    30         {
    31             int xx=x+step[i][0],yy=y+step[i][1];
    32             if(!in(xx,yy)||cpy[xx][yy]) continue;
    33             cpy[xx][yy]=1;
    34             time[xx][yy]+=t+1;
    35             q.push(piii(pii(xx,yy),t+1));
    36         }
    37     }
    38     return;
    39 }
    40 
    41 int main(void)
    42 {
    43     while(~scanf("%d%d",&n,&m))
    44     {
    45         memset(time,0,sizeof(time));
    46         KFC.clear();
    47         pii Y,M;
    48         for(int i=1;i<=n;i++)
    49         {
    50             char s[300];
    51             scanf("%s",s+1);
    52             for(int j=1;j<=m;j++)
    53             {
    54                 map[i][j]=(s[j]=='#')?1:0;
    55                 if(s[j]=='Y') Y=pii(i,j);
    56                 else if(s[j]=='M') M=pii(i,j);
    57                 else if(s[j]=='@') KFC.push_back(pii(i,j));
    58             }
    59         }
    60         bfs(Y); bfs(M);
    61         int ans=2147483647;
    62         for(int i=0;i<KFC.size();i++)
    63         {
    64             int x=KFC[i].first,y=KFC[i].second;
    65             if(time[x][y]) ans=min(ans,time[x][y]);
    66         }
    67         printf("%d
    ",ans*11);
    68     }
    69     return 0;
    70 }
    Aguin

    下午多校。

    先不补。

    HDU 4901 Zombie’s Treasure Chest

    很神奇的题目。

    2个物品的背包。

    前面贪。后面爆。

    证明见Link

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <algorithm>
     4 using namespace std;
     5 typedef long long LL;
     6 
     7 LL gcd(LL a,LL b)
     8 {
     9     return a%b?gcd(b,a%b):b;
    10 }
    11 
    12 int main(void)
    13 {
    14     int T; cin>>T;
    15     for(int kase=1;kase<=T;kase++)
    16     {
    17         LL N,S1,V1,S2,V2;
    18         scanf("%I64d%I64d%I64d%I64d%I64d",&N,&S1,&V1,&S2,&V2);
    19         LL lcm=S1*S2/gcd(S1,S2);
    20         LL Max=0,tem=0,k=N/lcm,left=N%lcm;
    21         if(k) {k--; left+=lcm;}
    22         tem=k*max(lcm/S1*V1,lcm/S2*V2);
    23         if(S1>S2) for(int i=0;i<=left/S1;i++) Max=max(Max,tem+i*V1+(left-S1*i)/S2*V2);
    24         else for(int i=0;i<=left/S2;i++) Max=max(Max,tem+i*V2+(left-S2*i)/S1*V1);
    25         printf("Case #%d: %I64d
    ",kase,Max);
    26     }
    27     return 0;
    28 }
    Aguin

    8.19

    补题。

    8.20

    最后一场多校。补。

    8.21

    多校就这么结束了。感觉还是很多空缺。

    补了几个不想补了。还是先多学点吧。

    8.22

    什么都没干。

  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/Aguin/p/4734079.html
Copyright © 2011-2022 走看看