标签:describe mem 字符串 输入 oid close memset 64bit set
这次比赛的确比较水23333
A长方体
一行三个整数a, b, c表示面积(1 <= a, b, c <= 10000)。
一行一个整数表示边长和。
1 1 1
12
4 6 6
28
设三边长为a、b、c,然后每个输入就是ab、bc、ac。先算出 $ abc= \sqrt{ab bc ac} $ 然后除一下就能得出a、b、c了。答案是(a+b+c)*4。
1 #include<bits/stdc++.h> 2 #define clr(x) memset(x,0,sizeof(x)) 3 #define clr_1(x) memset(x,-1,sizeof(x)) 4 #define mod 1000000007 5 #define INF 0x3f3f3f3f 6 #define LL long long 7 #define pb push_back 8 #define pbk pop_back 9 #define ls(i) (i<<1) 10 #define rs(i) (i<<1|1) 11 #define mp make_pair 12 using namespace std; 13 LL a,b,c,l,ans; 14 int main() 15 { 16 17 scanf("%lld%lld%lld",&a,&b,&c); 18 l=sqrt(a*b*c); 19 a=l/a; 20 b=l/b; 21 c=l/c; 22 ans=(a+b+c)*4; 23 printf("%lld\n",ans); 24 return 0; 25 }
B 好位置
一行两个字符串s,x,这两个串均由小写字母构成。
1 <= |s|, |x| <= 200000
Yes表示是。
No表示不是。
abab ab
Yes
abacaba aba
No
abc ba
No
检查一下s的头尾是不是都是严格的x串,并且s里面没有出现x以外的字母。如果不是严格的x串或者出现其他字母为No否则为Yes。
1 #include<bits/stdc++.h> 2 #define clr(x) memset(x,0,sizeof(x)) 3 #define clr_1(x) memset(x,-1,sizeof(x)) 4 #define mod 1000000007 5 #define INF 0x3f3f3f3f 6 #define LL long long 7 #define pb push_back 8 #define pbk pop_back 9 #define ls(i) (i<<1) 10 #define rs(i) (i<<1|1) 11 #define mp make_pair 12 using namespace std; 13 const int N=2e5+10; 14 char s[N],x[N]; 15 bool vis[26]; 16 int n,m,lens,lenx; 17 int main() 18 { 19 scanf("%s%s",s,x); 20 lens=strlen(s); 21 lenx=strlen(x); 22 for(int i=0;i<lenx;i++) 23 if(s[i]!=x[i]) 24 { 25 printf("No\n"); 26 return 0; 27 } 28 else 29 vis[s[i]-‘a‘]=1; 30 for(int i=lens-1;i>=lens-lenx;i--) 31 if(s[i]!=x[i-(lens-lenx)]) 32 { 33 printf("No\n"); 34 return 0; 35 } 36 for(int i=0;i<lens;i++) 37 if(!vis[s[i]-‘a‘]) 38 { 39 printf("No\n"); 40 return 0; 41 } 42 printf("Yes\n"); 43 return 0; 44 }
C 操作数
链接:https://www.nowcoder.com/acm/contest/109/C
来源:牛客网
第一行两个整数n,k(1 <= n <= 2000, 0 <= k <= 1,000,000,000);i
第二行n个整数表示a数组(0 <= a
<= 1,000,000,000)。
一行n个整数表示答案。
3 1 1 2 3
1 3 6
5 0 3 14 15 92 6
3 14 15 92 6
加和类的问题肯定是和组合数有关系的啦。
首先是
$ \begin{bmatrix} a_1 & a_2 & a_3 & ……& a_n \end{bmatrix}\quad $ $ \begin{bmatrix}1 & 1 & 1 & …… & 1 \\ 0 & 1 & 1 & …… & 1 \\ 0 & 0 & 1 & …… & 1 \\ …… & …… & …… & …… & …… \\ 0 & 0 & 0 & …… & 1 \end{bmatrix}^k \quad $
然后你求后面这个矩阵k次方以后会发现其实他是:
$ \begin{bmatrix} C^0_k & C^1_{k+1} & C^2_{k+2} & …… & C^{n-1}_{k+n-1} \\ 0 & C^0_{k} & C^1_{k+1} & …… & C^{n-2}_{k+n-2} \\ …… & …… & …… & …… & …… \\ 0 & 0 & 0 & …… & C^0_k \end{bmatrix} \quad $
然后写个快速幂求一下逆元,然后求一下对应的组合数就好了。
1 #include<bits/stdc++.h> 2 #define clr(x) memset(x,0,sizeof(x)) 3 #define clr_1(x) memset(x,-1,sizeof(x)) 4 #define mod 1000000007 5 #define INF 0x3f3f3f3f 6 #define LL long long 7 #define pb push_back 8 #define pbk pop_back 9 #define ls(i) (i<<1) 10 #define rs(i) (i<<1|1) 11 #define mp make_pair 12 using namespace std; 13 const int N=1e4+10; 14 LL fac[N],inv[N]; 15 LL quick_pow(LL x,LL n) 16 { 17 LL res=1; 18 x%=mod; 19 while(n) 20 { 21 if(n&1) res=res*x%mod; 22 n>>=1,x=x*x%mod; 23 } 24 return res; 25 } 26 LL k,a[N],mul[N],ans[N]; 27 int n; 28 void init(int n,LL k) 29 { 30 fac[0]=1; 31 LL p=1; 32 for(int i=1;i<=n;i++) 33 fac[i]=fac[i-1]*(i+k)%mod,p=p*i%mod; 34 35 inv[n]=quick_pow(p,mod-2); 36 for(int i=n-1;i>=0;i--) 37 inv[i]=inv[i+1]*(i+1)%mod; 38 return ; 39 } 40 LL comb(int n) 41 { 42 return fac[n]*inv[n]%mod; 43 } 44 int main() 45 { 46 scanf("%d%lld",&n,&k); 47 for(int i=1;i<=n;i++) 48 scanf("%lld",a+i); 49 init(n,k-1); 50 for(int i=0;i<=n;i++) 51 mul[i]=comb(i); 52 for(int i=1;i<=n;i++) 53 { 54 for(int j=0;j<i;j++) 55 { 56 int k=i-j; 57 ans[i]=(ans[i]+a[k]*mul[j]%mod)%mod; 58 } 59 } 60 for(int i=1;i<n;i++) 61 printf("%lld ",ans[i]); 62 printf("%lld\n",ans[n]); 63 return 0; 64 }
标签:describe mem 字符串 输入 oid close memset 64bit set
原文地址:https://www.cnblogs.com/wujiechao/p/9004627.html