第五周 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 }
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 }
后面用到的数学略多跪了。我还是先切完菜。
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 }
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 }
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 }
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 }
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 }
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 }
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 }
下午多校。
先不补。
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 }
8.19
补题。
8.20
最后一场多校。补。
8.21
多校就这么结束了。感觉还是很多空缺。
补了几个不想补了。还是先多学点吧。
8.22
什么都没干。