1. zhx's submissions
问题描述
作为史上最强的刷子之一,zhx在各大oj上交了很多份代码,而且多数都AC了。
有一天,zhx想数一数他在n个oj上一共交了多少份代码。他现在已经统计出在第i个oj上,他交了ai份代码。而把它们加起来就是你的工作了。
当然zhx是一个不走寻常路的人,所以他的数字都是用B进制表示的。而他也要求你告诉他B进制的数。
但是zhx有一个恶趣味的习惯,他算加法的时候从来不进位。比如他算十进制5+6的答案是1。而且他还要求你也要按照他的方式来做加法。
输入描述
多组数据(不超过1000组)。读到文件尾。
对于每组数据,第一行是两个空格分开的正整数n和B(1≤n≤100, 2≤B≤36)
接下来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(" "); 35 } 36 return 0; 37 }
2.zhx's contest
问题描述
作为史上最强的刷子之一,zhx的老师让他给学弟(mei)们出n道题。
zhx认为第i道题的难度就是i。他想要让这些题目排列起来很漂亮。
zhx认为一个漂亮的序列{ai}下列两个条件均需满足。
1:a1..ai是单调递减或者单调递增的。
2:ai..an是单调递减或者单调递增的。
他想你告诉他有多少种排列是漂亮的。
因为答案很大,所以只需要输出答案模p之后的值。
输入描述
多组数据(不多于1000组)。读到文件尾。
每组数据包含一行两个整数n和p。(1≤n,p≤1018)
输出描述
每组数据输出一行一个非负整数表示答案。
思路: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 ",1%p);else 31 printf("%I64d ",(mpow(2,n,p)-2+p)%p); 32 } 33 return 0; 34 }