AmazingCounters.com

BestCoder Round #33

1. zhx's submissions
问题描述
作为史上最强的刷子之一,zhx在各大oj上交了很多份代码,而且多数都AC了。
有一天,zhx想数一数他在n个oj上一共交了多少份代码。他现在已经统计出在第i个oj上,他交了ai份代码。而把它们加起来就是你的工作了。
当然zhx是一个不走寻常路的人,所以他的数字都是用B进制表示的。而他也要求你告诉他B进制的数。
但是zhx有一个恶趣味的习惯,他算加法的时候从来不进位。比如他算十进制5+6的答案是1。而且他还要求你也要按照他的方式来做加法。
输入描述
多组数据(不超过1000组)。读到文件尾。
对于每组数据,第一行是两个空格分开的正整数nB(1n100, 2B36)
接下来n行,每行一个B进制数ai。数码是0到9和小写a到z。输入可能包含前导0,数字长度不超过200位。
思路:直接模拟高精度:
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 int main()
 6 {
 7     int n,b;
 8     while(scanf("%d%d",&n,&b)!=EOF)
 9     {
10         char ch[500];
11         int ans[500]={0},a[500]={0};
12         while(n--)
13         {
14                         memset(a,0,sizeof(a));
15             scanf("%s",ch+1);
16             int len=strlen(ch+1);
17             for(int i=1;i<=len;i++)
18             {
19                 if('0'<=ch[i]&& ch[i]<='9')a[len-i+1]=ch[i]-'0';
20                 else a[len-i+1]=ch[i]-'a'+10;
21             }
22             for(int i=1;i<=max(len,ans[0]);i++)
23             {
24                 ans[i]=(ans[i]+a[i])%b;
25             }
26             ans[0]=max(ans[0],len);
27         }
28         while(ans[ans[0]]==0 &&ans[0]>=2)ans[0]--;
29         for(int i=ans[0];i>=1;i--)
30         {
31             if(ans[i]>=10)printf("%c",'a'+ans[i]-10);
32             else printf("%d",ans[i]);
33         }
34         printf("\n");
35     }
36     return 0;
37 }
View Code

 

2.zhx's contest

问题描述
作为史上最强的刷子之一,zhx的老师让他给学弟(mei)们出n道题。
zhx认为第i道题的难度就是i。他想要让这些题目排列起来很漂亮。
zhx认为一个漂亮的序列{ai}下列两个条件均需满足。
1:a1..ai是单调递减或者单调递增的。
2:ai..an是单调递减或者单调递增的。
他想你告诉他有多少种排列是漂亮的。
因为答案很大,所以只需要输出答案模p之后的值。
输入描述
多组数据(不多于1000组)。读到文件尾。
每组数据包含一行两个整数np。(1n,p1018
输出描述
每组数据输出一行一个非负整数表示答案。

思路:2^n-2很明显,然后就是p在1e18 直接搞必定超long long,然后搞个快速乘法就可以了注意 1 1 这组神奇的数据

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 long long mul(long long x,long long y,long long p)
 6 {
 7     long long e=0;
 8     for(;y;y>>=1)
 9     {
10         if(y&1)e=(e+x)%p;
11         x=(x+x)%p;
12     }
13     return e;
14 }
15 long long mpow(long long x,long long y,long long p)
16 {
17     long long e=1;
18     for(;y;y>>=1)
19     {
20         if(y&1)e=mul(e,x,p);
21         x=mul(x,x,p);
22     }
23     return e;
24 }
25 int main()
26 {
27     long long n,p;
28     while(scanf("%I64d%I64d",&n,&p)!=EOF)
29     {
30         if(n==1)printf("%d\n",1%p);else
31         printf("%I64d\n",(mpow(2,n,p)-2+p)%p);
32     }
33     return 0;
34 }
View Code

 

posted @ 2015-03-14 22:07  philippica  阅读(168)  评论(0编辑  收藏  举报