2020杭電多校第六場部分題解(1001/1002/1009)
阿新 • • 發佈:2020-08-06
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 if1001(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]; 23void 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 }
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