2020杭电多校第六场部分题解(1001/1002/1009)

1001

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6827

题意:给定n个数,求第i个数到第j个数的平均值的期望(ij为1到n的随机数且i<=j)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int mod=1e9+7;
 4 const int N=2e6+5;
 5 typedef unsigned long long ull;
 6 typedef long long ll;
 7 ll quickpow(ll a, ll b) {
 8     if (b < 0) return 0;
 9     ll ret = 1;
10     a %= mod;
11     while(b) {
12         if (b & 1) ret = (ret * a) % mod;
13         b >>= 1;
14         a = (a * a) % mod;
15     }
16     return ret;
17 }
18 ll Inv(ll a) {
19     return quickpow(a, mod - 2);
20 }
21 int n;
22 ll inv[N],J[N];
23 void init()
24 {
25     inv[1] = 1;J[1]=1;
26     for(ll i = 2; i < N; ++ i){
27         inv[i] = (mod - mod / i) * inv[mod % i] % mod;
28         J[i]=(J[i-1]+i)%mod;
29     }
30 }
31 int a[N];
32 ll sum[N],pre[N];
33 int main()
34 {
35     init();
36     int t,i,j,n;scanf("%d",&t);
37     while(t--){
38         scanf("%d",&n);
39         ll gs=n/2;if(n%2==1)gs++;
40         memset(sum,0,sizeof sum);
41         memset( pre,0,sizeof pre);
42         for(i=1;i<=n;i++){
43             scanf("%d",&a[i]);
44             sum[1]=(a[i]+sum[1])%mod;
45         }
46         pre[1]=sum[1];
47         for(i=2;i<=gs;i++){
48             pre[i]=(pre[i-1]-a[i-1]-a[n-i+2]+mod)%mod;
49             sum[i]=(sum[i-1]+pre[i])%mod;
50         }
51         ll ans=0;
52         for(i=1;i<=gs;i++){
53             ans=(ans+sum[i]*inv[i]%mod)%mod;
54         }
55         int k=n%2==0?gs:gs-1;
56         for(i=gs+1;i<=n;i++){
57             ans=(ans+sum[k--]*inv[i]%mod)%mod;
58         }
59         printf("%lld\n",ans*Inv(J[n])%mod);
60     }
61     return 0;
62 }
1001

1002

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6827

题意:给定一个等式,问在几进制下等式成立

思路:模拟

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int main()
 5 {
 6     char s[25];
 7     while(~scanf("%s",s)){
 8         int maxn=1,l=strlen(s);
 9         char ch;
10 
11         for(int i=0;i<l;i++){
12             if(s[i]>='0'&&s[i]<='9')maxn=max(maxn,s[i]-'0');
13             else if(s[i]>='A'&&s[i]<='F')maxn=max(maxn,s[i]-'A'+10);
14             if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') ch=s[i];
15         }
16         int flag=0;
17         for(int i=maxn+1;i<=16;i++){
18             ll a=0,b=0,c=0,ab=-1;
19             int j=0;
20             for(;j<l;j++){
21                 if(s[j]>='0'&&s[j]<='9') a=1LL*a*i+s[j]-'0';
22                 else if(s[j]>='A'&&s[j]<='F') a=1LL*a*i+s[j]-'A'+10;
23                 else break;
24             }
25             for(j=j+1;j<l;j++){
26                 if(s[j]>='0'&&s[j]<='9') b=1LL*b*i+s[j]-'0';
27                 else if(s[j]>='A'&&s[j]<='F') b=1LL*b*i+s[j]-'A'+10;
28                 else break;
29             }
30             for(j=j+1;j<l;j++){
31                 if(s[j]>='0'&&s[j]<='9') c=1LL*c*i+s[j]-'0';
32                 else if(s[j]>='A'&&s[j]<='F') c=1LL*c*i+s[j]-'A'+10;
33             }
34             if(ch=='+')ab=a+b;
35             else if(ch=='-') ab=a-b;
36             else if(ch=='*') ab=a*b;
37             else if(ch=='/'){
38                 if(a%b==0) ab=a/b;
39             }
40             //printf("%lld %lld %lld %lld\n",a,b,ab,c);
41             if(ab==c){
42                 printf("%d\n",i);
43                 flag=1;
44                 break;
45             }
46         }
47         if(!flag) printf("-1\n");
48     }
49 }
1002

1009

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6827

题意:对于任意b进制数,若y的各位之和可以被x整除,则y也能被x整除,反之不能

官方题解:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=2e6+5;
 4 
 5 int main()
 6 {
 7     int t;
 8     long long b,x;
 9     scanf("%d",&t);
10     while(t--)
11     {
12         scanf("%lld%lld",&b,&x);
13         if(b>x)
14         {
15             if(__gcd(b-1,x)==x)printf("T\n");
16             else printf("F\n");
17         }
18         else printf("F\n");
19     }
20     return 0;
21 }
1009

 

posted @ 2020-08-06 19:57  麦客_zeng  阅读(229)  评论(0)    收藏  举报