A、偷吃糖果
Time Limit: 1000Ms
Memory Limit: 65536KB
Description
小鱼喜欢吃糖果。他有两盒糖果,两盒糖果分别仅由小写字母组成的字符串s和字符串t构成。其中'a'到'z'表示具体的某种糖果类别。
他原本打算送给他喜欢的女生,但是要送给女孩子的话两盒糖果不能有差别(即字符串s和t完全相同)。所以,他决定偷吃几块,他吃糖果的策略是每次选出一盒糖果中两个连续的同种类别的糖果,然后吃掉其中一块。该策略可以使用多次。
例如一盒糖果是'rrrjj',他可以把这盒糖果变成'rrjj'或者'rrrj'。现在你要告诉小鱼,经过他多次偷吃糖果之后,两盒糖果能否送给他喜欢的女孩子。如果可以输出'Yes',如果不行输出'No'。
Input
第一行一个T,表示T组测试数据。每组测试数据格式如下。
第一行表示字符串s,第二行表示字符串t。
1 ≤ T ≤ 100
Each character of s, t will be between 'a' and 'z'.
1 ≤ length of string s ≤ 1000
1 ≤ length of string t ≤ 1000
Output
对于每组测试数据,输出Yes,或者No。
Sample Input
2
rrrjj
rrrj
rj
jr
Sample Output
Yes
No
Hint
题目中的第一个样例:
第一盒糖果:rrrjj -> rrjj -> rjj -> rj
第二盒糖果:rrrj -> rrj -> rj
分析:咋一看以为是字符串匹配,后来题意理解错了,然后开始从新写,看这句话“两个连续的同种类别的糖果”
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 int main(void) 5 { 6 char a[1100], b[1100], a1[1100], b1[1100],c; 7 int i1,i, j, t, n; 8 9 scanf("%d", &t); 10 c = getchar(); 11 for (i1 = 0;i1 < t;i1++) 12 { 13 gets(a); 14 gets(b); 15 j = 0; 16 for (i = 1;a[i] != '\0';i++) 17 { 18 if (a[i] != a[i - 1]) 19 { 20 a1[j] = a[i - 1]; 21 j++; 22 } 23 } 24 a1[j] = a[i - 1]; 25 j++; 26 a1[j] = '\0'; 27 j = 0; 28 for (i = 1;b[i] != '\0';i++) 29 { 30 if (b[i] != b[i - 1]) 31 { 32 b1[j] = b[i - 1]; 33 j++; 34 } 35 } 36 b1[j] = b[i - 1]; 37 j++; 38 b1[j] = '\0'; 39 if (strcmp(a1, b1) == 0) 40 printf("Yes\n"); 41 else 42 printf("No\n"); 43 } 44 }
H、谁才是最强战舰!
Time Limit: 1000MS
Memory Limit: 65536KB
Description
依阿华来到镇守府的第一件事情,就是找大和solo!
然而这并不是什么好消息,说不定,镇守府,甚至佐伯湾就这么消失了。。。
于是,提督君想了一个简单的游戏,来分出她们的胜负。游戏规则如下:这里有N堆石子,每堆石子有a[i](1<=i<=N)个,每人轮流从其中的某一堆石子中拿出任意个石子(只能在其中一堆拿,不能不拿),大和先手,谁拿出了最后一个石子,谁输。若大和必胜,输出“Yamato_Saikou!”,若依阿华必胜,输出“Meidikeji_Shijiediyi!”,若两边都无法必胜,输出“Sayonara_Konosekai!”.
Input
第一行输入一个正整数T(1 <= T <= 1000),表示有T组测试数据。
对于每组测试数据:
第一行一个正整数,N(N<=1000),表示有N堆石子。
第二行N个整数a[i](1<=a[i]<=1000),表示每堆石子的数量。
Output
若大和必胜,输出“Yamato_Saikou!”,若依阿华必胜,输出“Meidikeji_Shijiediyi!”,若两边都无法必胜,输出“Sayonara_Konosekai!”.
Sample Input
3
1
5
2
1 2
3
1 1 1
Sample Output
Yamato_Saikou!
Yamato_Saikou!
Meidikeji_Shijiediyi!
思路:anti-nim博弈,题目给出这句话,自己感觉蒙圈了,好像没有用到
1 #include<stdio.h> 2 int main() 3 { 4 int t; 5 scanf("%d",&t); 6 while(t--) 7 { 8 int n,s=0,m,c=0; 9 scanf("%d",&n); 10 m=n; 11 while(n--) 12 { 13 int num; 14 scanf("%d",&num); 15 s^=num; 16 if(num>1) 17 c++; 18 } 19 if(!s&&!c||(s&&c)) 20 printf("Yamato_Saikou!\n"); 21 else 22 printf("Meidikeji_Shijiediyi!\n"); 23 } 24 }
C、count_prime
Time Limit: 1000ms
Memory Limit: 65536KB
Description
给定你一个数n,请你统计出在[a,b]这个区间中和n互质的数的个数。
两个数互质当且仅当他们除了1之外没有其他的公共因子或者他们最大的公共因子是1。1和任何数是互素的。
Input
第一行输入一个整数T(1 <= T <= 100),表示T组测试数据。
接下来T行,每行3个整数a,b,n(1 <= a <=b <=10^15, 1<= n <= 10^9),用空格隔开。
Output
输出一个整数表示和n互质的数的个数。
Sample Input
2
1 10 2
3 10 5
Sample Output
5
6
灰灰做的:思路是容斥原理
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define LL long long 6 #define maxn 70 7 8 LL prime[maxn]; 9 LL make_ans(LL num,int m) 10 { 11 LL ans=0,tmp,i,j,flag; 12 for(i=1;i<(LL)(1<<m);i++) 13 { 14 tmp=1,flag=0; 15 for(j=0;j<m;j++) 16 if(i&((LL)(1<<j))) 17 flag++,tmp*=prime[j]; 18 if(flag&1)//容斥原理 19 ans+=num/tmp; 20 else 21 ans-=num/tmp; 22 } 23 return ans; 24 } 25 26 int main() 27 { 28 int T,t=0,m; 29 LL n,a,b,i; 30 scanf("%d",&T); 31 while(T--) 32 { 33 scanf("%I64d%I64d%I64d",&a,&b,&n); 34 m=0; 35 for(i=2;i*i<=n;i++) 36 if(n&&n%i==0) 37 { 38 prime[m++]=i; 39 while(n&&n%i==0) 40 n/=i; 41 } 42 if(n>1) 43 prime[m++]=n; 44 printf("%I64d\n",(b-make_ans(b,m))-(a-1-make_ans(a-1,m))); 45 } 46 return 0; 47 }
一共做出5题,未完待续。。。。。。。