【个人邀请赛】洛谷 Math趣味赛

前言

话说其实写这篇博客是看了之前某 dalao d a l a o 这样写,于是我就效仿了一下
不过那位 dalao d a l a o 据说公开赛被刷下来了,好像是因为题目过水。。。后来他又奋发图强,出了几个稍微难一点的题,不过还是没有通过,深感同情。。。
之前开的团队公开赛也被刷了,理由好多啊,不过总算管理有认真看了,不过这都无所谓,总之本人自己开了一个邀请赛(因为太弱不敢开公开),希望大家多多支持!


分割线

简介

这是一场很水的比赛。。。
大部分都是水题,由于本人在洛谷发不了讨论所以就发博客了。。。
有些题目在比赛之前可能本人写过博客,现在已经全部影藏了,在赛后我会放出来的!

这篇博客的实际意义主要是下面这两条

在赛时这里是赛时答疑
在赛后这里是赛后题解

这里也会给出各种小 Tips T i p s ,尽情期待吧!(现已停止)
若有疑问请在下方讨论提问,谢谢配合!

链接:https://www.luogu.org/contestnew/show/7773

赛时答疑

(每天给出一个 Tip T i p

Tip1 T i p 1 所有题目的正解均跟题目名称有关 #2018年6月6日

Tip2 T i p 2 每个题目的正解总时间不超过1s #2018年6月7日

Tip3 T i p 3 所有升级版的题目均可以通过改造原题AC #2018年6月8日

Tip4 T i p 4 有一半以上的题需要预处理 #2018年6月9日

有疑问就在下方评论吧!

赛后题解

T1

等价于求 log(n) l o g ( n ) ,直接输出就行

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
long long n;
int main()
{
    cin>>n;
    long long a=log2(n);
    cout<<a+1;
    return 0;
}

T2

若此数是完全平方数输出其平方根,否则输出那一串字符

#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    if (sqrt(n)!=floor(sqrt(n))) {printf("Wu Yongcong is in the pit");return 0;}
    printf("%d",(int)sqrt(n));
}

T3

等价求 gcd(a,b) g c d ( a , b )

#include<cstdio>
#include<iostream>
using namespace std;
int gcd(int x,int y)
{
    if (x<y) swap(x,y);
    return x%y==0? y:gcd(y,x%y);
}
int main()
{
    int a,b;scanf("%d %d",&a,&b);
    printf("%d",gcd(a,b));
}

T4

改造快排
https://blog.csdn.net/xuxiayang/article/details/80515226

T5&T8

二进制公式推论,由于内存的设置,所以不能使用数组,该代码适用于两题

#include<cstdio>
using namespace std;
char c,d;int n,f;int m,k;
int read()
{
    f=0;
    while(c=getchar(),c<=47||c>=58);f=(f<<3)+(f<<1)+c-48;
    while(c=getchar(),c>=48&&c<=57) f=(f<<3)+(f<<1)+c-48;
    return f;
}
void write(int x)
{
    if(x>9) write(x/10);
    putchar(x%10+48);
    return;
}
void writeln(int x)
{
    write(x);
    putchar(10);
    return;
}
int main()
{
    n=read();m=read();
    while(m--)
    {
        while(d=getchar(),d<65||d>69);k=read();
        if(d==65) writeln((n>>k)&1);
        if(d==66) writeln(n&((1<<k)-1));
        if(d==67) n^=(1<<k),writeln(n);
        if(d==68) n|=(1<<k),writeln(n);
        if(d==69) n&=~(1<<k),writeln(n);
    }
}

T6

详见https://blog.csdn.net/xuxiayang/article/details/80515266
nlogn n l o g n nn n n 都能过

nn n n

#include<cstdio>
#include<cmath>
using namespace std;
int n,a[500001],len;
void write(int x){if(x>9)write(x/10);putchar(x%10+48);return;}
void writes(int x){write(x);putchar(32);return;}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        len=0;
        for (int j=1;j*j<=i;j++)
            if (i%j==0)
             a[++len]=j,writes(j);
        for (int j=len;j>0;j--)
         if(i/a[j]>a[j])
          writes(i/a[j]);
        putchar(10);
    }
}

nlogn n l o g n

#include<cstdio>
#include<vector>
using namespace std;int n;
vector<int>factor[500001];
void write(int x){if(x>9)write(x/10);putchar(x%10+48);return;}
void writes(int x){write(x);putchar(32);return;}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
     for(int j=1;j<=n/i;j++)
      factor[i*j].push_back(i);
    for(int i=1;i<=n;putchar(10),i++)
     for(int j=0;j<factor[i].size();j++)
      writes(factor[i][j]);
}

T7

因为 gcd(a,b)<min(a,b) g c d ( a , b ) < m i n ( a , b ) ,然后又因为 min(a,b)<maxlongint m i n ( a , b ) < m a x l o n g i n t ,所以可以只需要做一次高精度

#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int a[202],m,ans[202],len1;
char s1[202];int gs,s=0;
string s2,s3;
void mod(int *x,int y)
{
     gs=0;
     for (int i=1;i<=len1;i++) 
     {
        s=(gs<<3)+(gs<<1)+a[i];
        ans[i]=s/m;
        gs=s%m;
     }
     return;
}
int gcd(int x,int y)
{
    return y?gcd(y,x%y):x;
}
int main()
{
    scanf("%s %d",s1,&m);len1=strlen(s1);
    for (int i=0;i<len1;i++) a[i+1]=s1[i]-48;
    mod(a,m);
    if (gs==0) printf("%d",m);else
    printf("%d",gcd(m,gs));
}

T9

详见https://blog.csdn.net/xuxiayang/article/details/80409705

50分

O(n) O ( n ) 筛素数,然后判断

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;int l,r,a[100000001],b[500001],ans,now;
int main()
{
    scanf("%d%d",&l,&r);
    a[1]=1;fill(a+2,a+2+r,2);
    for(int i=2;i<=ceil(sqrt(r));i++)
     for(int j=i;j<=r/i;j++)
      if(i==j) a[i*j]++;else a[i*j]+=2;
    for(int i=2;i<=r;i++)
     if(a[i]>now)
      {
        if(i>=l) b[++ans]=i;
        now=a[i];
      }
    printf("%d\n",ans);
    for(int i=1;i<=ans;i++) printf("%d ",b[i]);
}

100分

动态规划+优化

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define N 170000
#define M 100
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int min1[N+1],min2[N+1],ans;
bool vis[M+1];
long long a[300],p[M+1],f[N+1],f1[N+1],m[N+1],t;
long long maxn=9223372036854775807LL,x,l,r;
string name,num,name2;
void make1(int i)//make1和make2是滚动
{
       r(j,1<<(i+1),N) f1[j]=maxn;
        r(j,1<<i,N)
        {
            if(f[j]==maxn) continue;
            m[j]=min(m[j],f[j]);
            double y=log(maxn/f[j])/log(p[i+1]);
            y=min(y,min((double)(N/(j+1)-1),(double)min1[j]));
            t=1;
            r(k,1,y)
            {
                t*=p[i+1];
                if(f[j]*t<f1[j*k+j])
                {
                    f1[j*k+j]=f[j]*t;
                    min2[j*k+j]=k;
                }
            }
        }
}
void make2(int i)
{
       r(j,1<<(i+1),N) f[j]=maxn;
        r(j,1<<i,N)
        {
            if(f1[j]==maxn) continue;
            m[j]=min(m[j],f1[j]);
            double y=log(maxn/f1[j])/log(p[i+1]);
            y=min(y,min((double)(N/(j+1)-1),(double)min2[j]));
            t=1;
            r(k,1,y)
            {
                t*=p[i+1];
                if(f1[j]*t<f[j*k+j])
                {
                    f[j*k+j]=f1[j]*t;
                    min1[j*k+j]=k;
                }
            }
        }
}
int main()
{
    r(i,2,M)
    {
        if(!vis[i]) p[++p[0]]=i;
        r(j,1,p[0])
        {
            if(M/p[j]<i) break;
            vis[i*p[j]]=true;
            if(i%p[j]==0) break;
        }
    }
    f[1]=1;
    r(i,2,62) {f[i]=f[i-1]<<1;min1[i]=i-1;}
    r(i,63,N) f[i]=maxn;
    r(i,2,N) m[i]=maxn;
    r(i,1,16)
    if(i&1) make1(i);else make2(i);
    r(i,1<<17,N) m[i]=min(m[i],f[i]);
    x=maxn;
    for(int i=N;i>1;i--)
    if(m[i]<x)
    {
        a[++a[0]]=m[i];
        x=m[i];
    }
    cin>>l>>r;//这之前的都是预处理
    r(i,1,a[0]) if(a[i]>=l&&a[i]<=r) ans++;
    printf("%d\n",ans);
    for(int i=a[0];i>0;i--) if(a[i]>=l&&a[i]<=r) cout<<a[i]<<' ';
}
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值