1. 程式人生 > 實用技巧 >2020杭電多校第六場部分題解(1001/1002/1009)

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