• 第五周 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

    什么都没干。

  • 相关阅读:
    mysql函数
    存储过程1
    linux下手动安装git教程
    python离线安装外部依赖包
    自动代码质量分析(GitLab+JenKins+SonarQube)
    Jenkins定时构建和轮询SCM设置说明
    jenkins
    linux在当前目录下根据文件名查找文件
    elastic search报错——“failed to obtain node locks”
    linux下rpm包安装、配置和卸载mysql
  • 原文地址:https://www.cnblogs.com/Aguin/p/4734079.html
Copyright © 2020-2023  润新知