首页 > 其他分享 >CSP模拟15

CSP模拟15

时间:2023-08-07 19:14:05浏览次数:33  
标签:15 int long 200010 ans return include CSP 模拟

CSP模拟15


T1 CF1850G The Morning Star

水题 但是考场写挂了
直接写阶乘会 \(RE\)(这里\(A\)阶乘可以优化成两个数相乘)
可以分解为4种不同斜率的直线用 \(map\) 存(

点击查看代码
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
using namespace std;
#define ll long long
ll ans;
ll n,si1,si2,si3,si4;
ll num1[200010],num2[200010],num3[200010],num4[200010];
int work(){
    for(int i=1;i<=si1;i++){
        num1[i]=0;
    }
    for(int i=1;i<=si2;i++){
        num2[i]=0;
    }
    for(int i=1;i<=si3;i++){
        num3[i]=0;
    }
    for(int i=1;i<=si4;i++){
        num4[i]=0;
    }
    si1=0,si2=0,si3=0,si4=0;ans=0;
    map<ll,ll>s1,s2,s3,s4;
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        ll x,y;
        scanf("%lld%lld",&x,&y);
        if(s1[y-x]==0){
            s1[y-x]=++si1;
        }
        if(s2[y+x]==0){
            s2[y+x]=++si2;
        }
        if(s3[x]==0){
            s3[x]=++si3;
        }
        if(s4[y]==0){
            s4[y]=++si4;
        }
        num1[s1[y-x]]++;
        num2[s2[y+x]]++;
        num3[s3[x]]++;
        num4[s4[y]]++;
    }
    for(int i=1;i<=si1;i++){
        if(num1[i]>=2)
        ans+=num1[i]*(num1[i]-1);
    }
    for(int i=1;i<=si2;i++){
        if(num2[i]>=2)
        ans+=num2[i]*(num2[i]-1);
    }
    for(int i=1;i<=si3;i++){
        if(num3[i]>=2)
        ans+=num3[i]*(num3[i]-1);
    }
    for(int i=1;i<=si4;i++){
        if(num4[i]>=2)
        ans+=num4[i]*(num4[i]-1);
    }
    printf("%lld\n",ans);
    return 0;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--) work();
    return 0;
}

T2 CF1582A Ntarsis' Set

我们可以发现,
\(a[n]=n\) 时 答案就是\(n*k+1\)
\(a[n]=n+1\) 时设不删除第 \(b\) 小的数,答案就是 \(n*(k-1)+b\)
删除第 \(k\) 小的数相当于让后面不会被删除的数的位置减一,考虑二分答案所在的位置,如果位置减到了零就意味着答案不合法。显然答案是满足单调性的。

点击查看代码
#include<iostream>
#include<cstdio>
using namespace std;
#define int long long
int n,k,a[200010],ans,an2,ma,top=1;
bool check(int x){
    int now=n;
    for(int i=1;i<=k;i++){
        while(a[now]>x)now--;
        x-=now;
    }
    return x>0;
}
void work(){
    //freopen("set_.in","r",stdin);
    scanf("%lld%lld",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    if(a[1]>1){
        printf("1\n");
        return;
    }
    int l=1,r=n*k+1;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)){
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    printf("%lld\n",ans);
    return;
}
signed main(){
    int t;
    scanf("%lld",&t);
    while(t--) work();
    return 0;
}

T3 CF932E Team Work

\[\begin{aligned} F(n,m)&=\sum\limits_{i=1}^n{n\choose i}i^m\\ &=n\sum\limits_{i=1}^n{n-1\choose i-1}i^{m-1}\\ &=n\left(\sum\limits_{i=1}^n{n\choose i}i^{m-1}-\sum\limits_{i=1}^n{n-1\choose i}i^{m-1}\right)\\ &=n(F(n,m-1)-F(n-1,m-1)) \end{aligned} \]

边界为 \(f(n, 0) = 2^n - 1\),复杂度 \(\mathcal{O}(k^2)\)。

除了排列组合这道题也可以使用第二类斯特林数做。

注意如果使用左移操作求 \(2\) 的整数次幂会发生溢出导致答案错误
递推要比记忆化搜索快的多。

记忆化搜索版
#include<iostream>
#include<cstdio>
using namespace std;
#define int long long
int n,k,ans,jc[200010],fc[200010],inv[200010];
const int mod=1e9+7;
int dp[5010][5010];
int qpow(int x,int y){
    int an=1;
    while(y){
        if(y&1){
            an*=x;
            an%=mod;
        }
        x*=x;
        x%=mod;
        y>>=1;
    }
    return an;
}
int cc(int x,int y){
    if(x<y) return 0;
    return jc[x]*fc[y]%mod*fc[x-y]%mod;
}
void work(){
    jc[0]=jc[1]=1;
    inv[0]=inv[1]=1;
    fc[0]=fc[1]=1;
    for(long long i=2;i<=200000;i++){
        jc[i]=jc[i-1]*i%mod;
        inv[i]=((mod-mod/i*inv[mod%i])%mod+mod)%mod;
        fc[i]=fc[i-1]*inv[i]%mod;
    }
    for(int i=1;i<=n;i++){
        ans+=cc(n,i)*qpow(i,k)%mod;
        ans%=mod;
    }
    printf("%lld",ans);
    return;
}
int dfs(int x,int y){
    if(dp[x-(n-k)][y]!=0) return dp[x-(n-k)][y];
    if(y==0) return dp[x-(n-k)][y]=qpow(2,x)-1; 
    return dp[x-(n-k)][y]=x*((dfs(x,y-1)-dfs(x-1,y-1)+mod)%mod)%mod;
}
signed main(){
    scanf("%lld%lld",&n,&k);
    if(n<k) work();
    else printf("%lld",dfs(n,k));
    return 0;
}
递推版
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define int long long
int n,k,ans,jc[200010],fc[200010],inv[200010];
const int mod=1e9+7;
int dp[5010][5010];
int qpow(int x,int y){
    int an=1;
    while(y){
        if(y&1){
            an*=x;
            an%=mod;
        }
        x*=x;
        x%=mod;
        y>>=1;
    }
    return an;
}
int cc(int x,int y){
    if(x<y) return 0;
    return jc[x]*fc[y]%mod*fc[x-y]%mod;
}
void work(){
    jc[0]=jc[1]=1;
    inv[0]=inv[1]=1;
    fc[0]=fc[1]=1;
    for(long long i=2;i<=200000;i++){
        jc[i]=jc[i-1]*i%mod;
        inv[i]=((mod-mod/i*inv[mod%i])%mod+mod)%mod;
        fc[i]=fc[i-1]*inv[i]%mod;
    }
    for(int i=1;i<=n;i++){
        ans+=cc(n,i)*qpow(i,k)%mod;
        ans%=mod;
    }
    printf("%lld",ans);
    return;
}
void  work2(){
    for(int i=0;i<=k;i++) dp[i][0]=qpow(2,i+n-k)-1;
    for(int i=1;i<=k;i++){
        for(int j=1;j<=k;j++){
            dp[i][j]=(i+n-k)*(dp[i][j-1]-dp[i-1][j-1]+mod)%mod;
        }
    }
    printf("%lld",dp[k][k]);
}
signed main(){
    scanf("%lld%lld",&n,&k);
    if(n<k) work();
    else work2();
    return 0;
}

标签:15,int,long,200010,ans,return,include,CSP,模拟
From: https://www.cnblogs.com/muzqingt/p/17612469.html

相关文章

  • 2023.8 模拟赛日志
    2023暑假集训ab班day1127round。预期:\(0+25+0=25\)实际:\(80+20+0=100\)题目:23ab-day1划(待写)不会做,搞了很久最后逐一假掉。竟然有分。题解是一些恶心的区间分类,比较简单,可惜了。好像有很多做法23ab-day1Heinrich树论科技,跳过。写了暴力换根。23ab-day1朝花夕拾......
  • 【考后总结】8 月 CSP-S 模拟赛 2
    8.7CSP模拟15只因你太美-蔡徐坤>只因你太美baby只因你太美baby>>只因你实在是太美baby只因你太美baby>>迎面走来的你让我如此蠢蠢欲动>>这种感觉我从未有>>CauseIgotacrushonyouwhoyou>>你是我的我是你的谁>>再多一眼看一眼就会爆......
  • Cilium系列-15-7层网络CiliumNetworkPolicy简介
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,介绍CiliumNetworkPolicies相比于Kubernetes网络策略最大的不同:7层网络策略能力.CiliumNetworkPolicy7层能力CiliumNetworkPolicy与标准NetworkPolicy的最大区别之一是支持L7协议感知规则。在......
  • ThinkPad P15vGen2 拆解评析
    ThinkPadP15vGen2拆解评析夜之子  5人赞同了该文章准备工具:3.0规格十字螺丝刀、塑料撬棒。1.用螺丝刀拧下后盖全部螺丝,从CD面接缝处用撬棒划开即可打开后盖。注:后盖螺丝均为防脱设计,拧松即可。2.内部全貌。3.内存、硬盘对应位置均有黑色麦拉......
  • Siemens 西门子S7-1200 PLC模拟量控制变频器
    一、任务目标该任务是关于西门子1200PLC模拟量应用案例。西门子S7-1200PLC的模拟量功能可以控制电动阀、变频器等外部设备,也可以采集传感器的温度、压力、液位、流量等。本任务主要使用的是模拟量控制台达变频器从而控制电机的转速。二、任务描述某设备厂,需要对设备进行散......
  • Siemens 西门子S7-200SMART PLC 自编模拟量输入结构化编程并生成库
    说到模拟量,对于从事工控行业的人员并不陌生,在使用S7-200SMARTPLC模拟量时,系统自带模拟考库文件,不需要自己去编写转换程序,直接调用库文件就可以使用了,那么如何通过公式自己编写模拟量输入转换程序呢?接下来就带大家来编写。01模拟量输入转换公式02参数化模拟量输入转换程序......
  • Cilium系列-15-7层网络CiliumNetworkPolicy简介
    系列文章Cilium系列文章前言今天我们进入Cilium安全相关主题,介绍CiliumNetworkPolicies相比于Kubernetes网络策略最大的不同:7层网络策略能力.CiliumNetworkPolicy7层能力CiliumNetworkPolicy与标准NetworkPolicy的最大区别之一是支持L7协议感知规则。......
  • 代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
    20.有效的括号    卡哥建议:讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。 大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。   题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%8......
  • AMD cpus在VM虚拟机安装macOS10.15和12教程一
    本教程采用软件为vmwareworkstation17pro,操作系统win10,CPU为5600G,macOS10.15或者macOS12VM虚拟机的下载和安装这里不阐述,大家可以百度一下macos13在上述环境下安装后会提示错误,macOS14beta暂时不支持安装,所以13-14可以暂时放弃macOS的下载请百度一下就有了~记得下载带引导......
  • Android模拟器DNS设置、使用adb命令获取手机ip地址
    https://blog.csdn.net/bonardgalton/article/details/5353296Android模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,对于在家里上网学习Android的人(像我)来讲,一般电脑的IP都是192.168.1.100之类的,不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置......