- #include
-
- int main()
- {
- int t;
- scanf("%d",&t);
-
- while(t--)
- {
- double month[20];
- for(int i=0;i<12;i++) scanf("%lf",&month[i]);
- double ans=1;
- for(int i=0;i<12;i++) ans=(month[i]/100+1)*ans;
-
- ans*=100;
- ans-=100;
-
- printf("%.3lf\n",ans);
- }
-
- return 0;
- }
注意题目输入的是带百分号的数字,输入1表示的是0.01,另外输出的答案也是输出带百分号的答案,注意还要减去原来的大小才是计算的利率,合理使用双精度变量非常方便
- #include
- #include
-
- #define N 100010
- bool state[N];
-
- int main()
- {
- int a,c,m;
- while(~scanf("%d%d%d",&a,&c,&m))
- {
- for(int i=0;i
false; -
- int temp=c%m;
- bool flag=false;
-
- while(state[temp]!=true)
- {
- state[temp]=true;
- temp=(a*temp+c)%m;
- }
- for(int i=0;i
- {
- if(state[i]==false)
- {
- flag=true;
- break;
- }
- }
-
- if(flag==true) printf("No\n");
- else printf("Yes\n");
- }
-
- return 0;
- }
注意标记状态,把0~m-1这些数字初始状态都标记为false,然后使用循环,如果可以生成某数字,就把该数字的状态标记为true,之后遍历0~m-1数字的状态,如果存在数字的状态仍然是false,说明该数字不能使用所给方程生成出来,输出No,反之输出Yes
第三题
- #include
-
- int gcd(int a,int b)
- {
- return b>0?gcd(b,a%b):a;
- }
-
- int main()
- {
- int t;
- scanf("%d",&t);
-
- while(t--)
- {
- int n,m;
- scanf("%d%d",&n,&m);
- int total_down=n*(n-1)*(n-2)/6;
- int total_up=m*(m-1)*(m-2)/6;
-
- int u=gcd(total_down,total_up);
- total_down/=u;
- total_up/=u;
-
- if(n==m) printf("1\n");
- else if(m<3) printf("0\n");
- else printf("%d/%d\n",total_up,total_down);
- }
-
- return 0;
- }
有一些简单的排列组合的知识,从n个元素里面选择3个,有多少种情况(total_down),从m个元素里面选择3个,有多少种情况(total_up),然后分情况讨论一下
第四题
- #include
-
- int main()
- {
- char c[2];
- while(~scanf("%s",c))
- {
- int length=c[0]-'A';
- for(int i=0;i<=length;i++)
- {
- int j,k,m;
- for(j=0;j<=length*2-i;j++) printf(" ");
- for(k=0;k<=i;k++) printf("%c",'A'+k);
- for(m=k-2;m>=0;m--) printf("%c",'A'+m);
- printf("\n");
- }
-
- for(int i=0;i<=length;i++)
- {
- int l,h,g;
- for(l=0;l<=length-i-1;l++) printf(" ");
- for(h=0;h<=i;h++) printf("%c",'A'+h);
- for(g=h-2;g>=0;g--) printf("%c",'A'+g);
-
- int q,w,e;
- for(q=0;q<=length*2-i*2;q++) printf(" ");
- for(w=0;w<=i;w++) printf("%c",'A'+w);
- for(e=w-2;e>=0;e--) printf("%c",'A'+e);
-
- printf("\n");
- }
- }
-
- return 0;
- }
是一个恐怖的模拟题目,我们输入的时候有换行,所以使用字符数组,字符串输入可以避免这个问题,数组的第一个元素就是我们输入的字符
可以分两个循环来实现,第一个循环是上面的三角形,第二个循环是下面的两个三角形,第二个循环里面先打印左边三角形,再打印右边三角形
循环变量的终点需要取什么数值,需要我们根据样例找规律找出来,建立各个循环变量之间的关系即可,可以一边写代码,一边测试打印结果是否符合预期效果
第五题
- #include
-
- int gcd(int a,int b)
- {
- return b>0?gcd(b,a%b):a;
- }
-
- int main()
- {
- int t;
- scanf("%d",&t);
-
- while(t--)
- {
- int n,k;
- scanf("%d%d",&n,&k);
-
- if(gcd(n,k+1)==1) printf("Yes\n");
- else printf("No\n");
- }
-
- return 0;
- }
注意k是中间间隔的青蛙数目,不是两只青蛙之间的距离,比如说第一个样例,从1到3,中间间隔的不是2那只青蛙,间隔的是4,5两只青蛙,所以从1到3其实是只可以逆时针走的(刚开始看到题目我还以为是题目描述出错了)
经过分析我们发现,k+1表示的是每一次青蛙可以跳的单位数,涉及到一些数论知识,笔者也没有完全弄懂,(k+1)x=c%n,(k+1)x=ny+c, (k+1)x-ny=c,根据裴蜀定理,可以知道需要k+1和n互质