第五周 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\n");
56         else if(!IsPrime(n)) printf("0\n");
57         else printf("%d\n",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\n",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\n",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)\n",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\n");
50         for(int i=1;i<=n;i++) printf("%d ",a[i].ans);
51         printf("\n");
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\n",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\n",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\n",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\n",kase,Max);
26     }
27     return 0;
28 }
Aguin

 

8.19

补题。

 

8.20

最后一场多校。补。

 

8.21

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

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

 

8.22

什么都没干。

posted @ 2015-08-16 13:32  Aguin  阅读(215)  评论(0编辑  收藏  举报