济南-1030试题解题报告
Posted 神犇(shenben)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了济南-1030试题解题报告相关的知识,希望对你有一定的参考价值。
济南-1030试题解题报告
By shenben
本解题报告解析均为100分解题思路。
上午
T1
题意:从1− n中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数
最大可能是多少.
解析:
1、 质因数分解
2、 1->n用质因数指数的相加的形式将1*n累乘起来
3、 扫一遍指数为奇数的质因数都-1,偶数的不变
4、 快速幂乘一遍,同时取模
T2
题意:有n个数,随机选择一段区间,如果这段区间的所有数的平均值在[L,R]中则
你比较厉害。求你比较厉害的概率
解析:(暴力枚举 40分)
100分需要推式子,过程略,最后式子:求S[R]-S[L]
(S[x]=前缀和a[i]-x的逆序对个数)
Fz= S[R]-S[L];
Fm=(n+1)*n/2;
Fz=fm-fz;
Ans=fz/fm(需要约分)
T3
题意:n*m的方阵上有?棵葱,你要修一些栅栏把它们围起来。一个栅栏是一段
沿着网格建造的封闭图形(即要围成一圈) 。各个栅栏之间应该不相交、不重叠
且互相不包含。如果你最多修?个栅栏,那么所有栅栏的长度之和最小是多少
解析:
搜索+各种剪枝
详见代码
下午
T1
题意:
一张长度为n的纸带,我们可以从左至右编号为0 −n(纸带最左端标号为
0) 。现在有m次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带
的长度是多少
解析:
模拟
折痕左边大,右边往左边折,同时右边向左边映射.L不变,R=折痕
折痕右边大,左边往右边折,同时左边向右边映射.L=折痕,R不变
(100分不能用并查集维护,应为并查集依靠数组的size太大)
T2
题意:给你 L,R,S,M,求满足L<=(S*x) mod M<=R最小的正整数x
解析:
略
详见代码
T3
题意:n个人坐成一圈,其中第k个人拿着一个球。每次每个人会以一定的概率向左边的人和右边的人传球。当所有人都拿到过球之后,最后一个拿到球的人即为胜者。求第n个人获胜的概率(所有人按照编号逆时针坐成一圈)
解析:
等比数列(还是推式子)
上午
T1代码:
#include<cstdio> #include<cstring> #define ll long long #define mod 100000007 using namespace std; const int N=5e6+10; int n,tot,prime[N]; bool check[N]; void prepare(){ for(int i=2;i<=n;i++){ if(!check[i]) prime[++tot]=i; for(int j=1;j<=tot&&prime[j]*i<=n;j++){ check[prime[j]*i]=1; if(i%prime[j]==0) break; } } } #define name "hao" int main(){ freopen(name".in","r",stdin); freopen(name".out","w",stdout); scanf("%d",&n); prepare(); memset(check,0,sizeof check); for(ll res,i=1;i<=tot;i++){ res=0; for(ll j=prime[i];j<=n;j*=(ll)prime[i]) res+=n/j; if(res&1) check[prime[i]]=1; } ll ans=1; for(ll i=2;i<=n;i++) if(!check[i]) ans=ans*i%mod; printf("%I64d",ans); fclose(stdin); fclose(stdout); return 0; }
T2代码:
#include<cstdio> #include<cstring> #include<algorithm> #define name "jian" #define ll long long #ifdef unix #define LL "%lld" #else #define LL "%I64d" #endif using namespace std; const int N=1e6+10; int n,L,R,a[N],b[N]; ll fz,fm,gy,ans,s[N],c[N]; inline const int read(){ register int x=0,f=1; register char ch=getchar(); while(ch<\'0\'||ch>\'9\'){if(ch==\'-\')f=-1;ch=getchar();} while(ch>=\'0\'&&ch<=\'9\'){x=(x<<3)+(x<<1)+ch-\'0\';ch=getchar();} return x*f; } void binary_chop(int l,int r){ if(l==r) return ; int mid=l+r>>1; binary_chop(l,mid);binary_chop(mid+1,r); int p=l,q=l,j=mid+1; while(p<=mid&&j<=r){ if(s[p]>s[j]){ ans+=mid-p+1; c[q++]=s[j++]; } else{ c[q++]=s[p++]; } } while(p<=mid) c[q++]=s[p++]; while(j<=r) c[q++]=s[j++]; for(int i=l;i<=r;i++) s[i]=c[i]; } int main(){ freopen(name".in","r",stdin); freopen(name".out","w",stdout); n=read();L=read();R=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) b[i]=a[i]-L; for(int i=1;i<=n+1;i++) s[i]=s[i-1]+b[i-1]; binary_chop(1,n+1);fz+=ans; memset(s,0,sizeof s);ans=0; for(int i=1;i<=n;i++) b[i]=a[i]-R; for(int i=1;i<=n+1;i++) s[i]=s[i-1]+b[i-1]; reverse(s+1,s+n+2); binary_chop(1,n+1);fz+=ans; fm=(ll)n*(n+1)/2; fz=fm-fz; gy=__gcd(fz,fm); fz/=gy;fm/=gy; if(fm==1) printf(LL"\\n",fz); else printf(LL "/" LL,fz,fm); fclose(stdin); fclose(stdout); return 0; } /* 40分代码,长个记性 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define name "jian" #define ll long long #ifdef unix #define LL "%lld" #else #define LL "%I64d" #endif inline const ll read(){ register ll x=0,f=1; register char ch=getchar(); while(ch<\'0\'||ch>\'9\'){if(ch==\'-\')f=-1;ch=getchar();} while(ch>=\'0\'&&ch<=\'9\'){x=(x<<3)+(x<<1)+ch以上是关于济南-1030试题解题报告的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode --- 1030. Matrix Cells in Distance Order 解题报告
LeetCode --- 1030. Matrix Cells in Distance Order 解题报告