码迷,mamicode.com
首页 > 其他好文 > 详细

牛客练习赛17

时间:2018-05-07 20:58:17      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:describe   mem   字符串   输入   oid   close   memset   64bit   set   

这次比赛的确比较水23333

A长方体

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给出共享长方体一个顶点的三个面的面积,求它十二条边的边长和。

输入描述:

一行三个整数a, b, c表示面积(1 <= a, b, c <= 10000)。

输出描述:

一行一个整数表示边长和。
示例1

输入

1 1 1

输出

12
示例2

输入

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 }
View Code

 

B 好位置

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给出两个串s和x
定义s中的某一位i为好的位置,当且仅当存在s的子序列技术分享图片 满足y=x且存在j使得i=kj成立。
问s中是否所有的位置都是好的位置。

输入描述:

一行两个字符串s,x,这两个串均由小写字母构成。
1 <= |s|, |x| <= 200000

输出描述:

Yes表示是。
No表示不是。
示例1

输入

abab
ab

输出

Yes
示例2

输入

abacaba
aba

输出

No
示例3

输入

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 }
View Code

 

C 操作数

链接:https://www.nowcoder.com/acm/contest/109/C
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给定长度为n的数组a,定义一次操作为:
1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007;
2. 执行a = s;
现在问k次操作以后a长什么样。

输入描述:

第一行两个整数n,k(1 <= n <= 2000, 0 <= k <= 1,000,000,000);
第二行n个整数表示a数组(0 <= a
i
<= 1,000,000,000)。

输出描述:

一行n个整数表示答案。
示例1

输入

3 1
1 2 3

输出

1 3 6
示例2

输入

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 }
View Code

 

牛客练习赛17

标签:describe   mem   字符串   输入   oid   close   memset   64bit   set   

原文地址:https://www.cnblogs.com/wujiechao/p/9004627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!