A:送分,裸的gcd。
1 #include<stdio.h>
2 #define il inline
3 #define it register int
4 int T,a,b,d;
5 il void gcd(int a,int b){
6 if(!b){d=a;return;}
7 gcd(b,a%b);
8 }
9 il void fr(int &num){
10 num=0;char c=getchar();int p=1;
11 while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
12 while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
13 num*=p;
14 }
15 int main(){
16 fr(T);
17 while(T--)
18 fr(a),fr(b),gcd(a,b),d==1?puts("Finite"):puts("Infinite");
19 return 0;
20 }
B:送分,直接把能用的都用掉就行。
1 #include<stdio.h>
2 #include<string.h>
3 #define it register int
4 #define il inline
5 using namespace std;
6 const int N=100005;
7 int T,n,a,b,c,ans;
8 char s[N],o[N];
9 il void fr(int &num){
10 num=0;char c=getchar();int p=1;
11 while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
12 while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
13 num*=p;
14 }
15 int main(){
16 fr(T);
17 while(T--){
18 scanf("%d%d%d%d%s",&n,&a,&b,&c,s+1),ans=n;
19 for(it i=1;i<=n;++i){
20 if(s[i]=='S'&&a) --a,o[i]='R';
21 else if(s[i]=='R'&&b) --b,o[i]='P';
22 else if(s[i]=='P'&&c) --c,o[i]='S';
23 else o[i]='K';
24 }
25 for(it i=1;i<=n;++i)
26 if(o[i]=='K'){
27 if(a) o[i]='R',--a;
28 else if(b) o[i]='P',--b;
29 else if(c) o[i]='S',--c;
30 --ans;
31 }
32 if(ans<((n+1)>>1)) puts("NO");
33 else{
34 puts("YES");
35 for(it i=1;i<=n;++i) putchar(o[i]);putchar('\n');
36 }
37 }
38 return 0;
39 }
C:送分,手玩一下发现每个块的贡献是斐波那契数列。而且好像这题之前CF出过的。
1 #include<stdio.h>
2 #include<string.h>
3 #define it register int
4 #define il inline
5 using namespace std;
6 const int N=1000005;
7 const long long mod=1e9+7;
8 char s[N];
9 long long f[N],ans=1;
10 int n;
11 il void fr(int &num){
12 num=0;char c=getchar();int p=1;
13 while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
14 while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
15 num*=p;
16 }
17 int main(){
18 scanf("%s",s+1),n=strlen(s+1);
19 f[0]=f[1]=1,f[2]=2;for(it i=3;i<=n;++i) f[i]=(f[i-1]+f[i-2])%mod;
20 for(it i=1;i<=n;++i){
21 if(s[i]=='u'||s[i]=='n'){
22 it j;
23 for(j=i;s[j]==s[i]&&j<=n;++j);
24 ans=1ll*ans*f[j-i]%mod,i=j-1;
25 }
26 if(s[i]=='m'||s[i]=='w'){
27 putchar('0');return 0;
28 }
29 }
30 printf("%lld",ans);
31 return 0;
32 }
D:最小生成树,预处理每一对(i,j)的连边就行。n个点连通就跳出不做。而且这题据说是USACO某道原题。。
1 #include<stdio.h> 2 #include<algorithm> 3 #define it register int 4 #define il inline 5 using namespace std; 6 const int N=3005; 7 long long ans; 8 int n,o[N],o1[N],o2[N],c1,c2,fa[N],cnt,cnum; 9 struct ky{ 10 int l,r;long long num; 11 bool operator<(const ky&p)const{ 12 return num<p.num; 13 } 14 }a[N*N]; 15 struct str{ 16 int x,y,c,k; 17 }b[N]; 18 il int A(it x){ 19 return x<0?-x:x; 20 } 21 il int dis(it i,it j){ 22 return A(b[i].x-b[j].x)+A(b[i].y-b[j].y); 23 } 24 il int fd(it x){ 25 return fa[x]==x?x:fa[x]=fd(fa[x]); 26 } 27 il void fr(int &num){ 28 num=0;char c=getchar();int p=1; 29 while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar(); 30 while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar(); 31 num*=p; 32 } 33 int main(){ 34 fr(n); 35 for(it i=1;i<=n;++i) fr(b[i].x),fr(b[i].y),fa[i]=i;fa[n+1]=n+1; 36 for(it i=1;i<=n;++i) fr(b[i].c); 37 for(it i=1;i<=n;++i) fr(b[i].k); 38 for(it i=1;i<=n;++i){ 39 for(it j=i+1;j<=n;++j) a[++cnt]=(ky){i,j,1ll*dis(i,j)*(b[i].k+b[j].k)}; 40 a[++cnt]=(ky){n+1,i,b[i].c}; 41 } 42 sort(a+1,a+1+cnt); 43 for(it i=1,t1,t2;i<=cnt;++i){ 44 t1=fd(a[i].l),t2=fd(a[i].r); 45 if(t1==t2) continue; 46 fa[t1]=t2,ans+=a[i].num,++cnum,a[i].l<=n?o1[++c2]=a[i].l,o2[c2]=a[i].r:o[++c1]=a[i].r; 47 if(cnum==n) break; 48 } 49 printf("%lld\n%d\n",ans,c1); 50 for(it i=1;i<=c1;++i) printf("%d ",o[i]); 51 printf("\n%d\n",c2); 52 for(it i=1;i<=c2;++i) printf("%d %d\n",o1[i],o2[i]); 53 return 0; 54 }