济南-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试题解题报告的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 1030A-C语言解题报告

LeetCode --- 1030. Matrix Cells in Distance Order 解题报告

济南集训20191001解题报告

LeetCode --- 1030. Matrix Cells in Distance Order 解题报告

cogs2745[济南集训 2017] 求gcd之和解题报告

2016-11-15试题解题报告