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

NOIP 模拟15

时间:2023-11-09 18:13:52浏览次数:32  
标签:15 NOIP int sum long times MAXN include 模拟

20+25+0+100 寄了,前仨题每道题都只会了一半也是挺厉害的。

A.数字变换

每次操作后 \((a+b)\bmod p\) 的值不变,所以可以先判断 \((a+b)\bmod p\) 是否等于 \((c+d)\bmod p\),不等的话一定无解。

然后就只需要考虑 \(a\),当 \(a=c\) 时就找到了答案。每次可以将 \(a\gets 2a\bmod p\) 或者 \(a\gets (a-b)\bmod p\),后者相当于 \((2*a-(a+b))\bmod p\)。

所以相当于操作 \(i\) 次后,\(a\) 可以变为 \((2^ia-x(a-b))\bmod p,x\in[0,2^i-1]\),因为你在第 \(j\) 次选择操作二最后会减掉 \(2^{i-j}\) 次 \(k\),所以相当于每个二进制位都可以分开考虑,所以 \(x\in[0,2^i-1]\)。

使 \(2^ia-x(a-b)\equiv c\pmod p\) 即 \(x(a-b+p)\equiv 2^ia-c\pmod p\),枚举 \(i\) 求解不定方程,当最小正整数 \(x<2^i\) 时 \(i\) 就是合法解,当 \(p\leq 2^i\) 次方时一定有解,复杂度 \(O(q\log p)\)。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<utility>
#include<queue>
#define int long long
using namespace std;
int p,T;
typedef pair<int,int> P;
unordered_map <int,int> h;
int exgcd(int a,int b,int &x,int &y)
{
    if(!b){x=1,y=0;return a;}
    int d=exgcd(b,a%b,y,x);
    y-=(a/b)*x;return d;
}
main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
    cin>>p>>T;
    while(T--)
    {
        int a,b,c,d,k;cin>>a>>b>>c>>d;k=(a+b)%p;
        if((c+d)%p!=(a+b)%p){cout<<"-1\n";continue;}
        if(a==c){cout<<"0\n";continue;}
        for(int i=1;;++i)
        {
            a=a*2%p;int now=(a-c+p)%p;
            int x,y;int d=exgcd(k,p,x,y);
            if(now%d) continue;x=(x*now%p+p)%p;
            if(x<(1<<i)){cout<<i<<'\n';break;}
        }
    }
    return 0;
}

B.均分财产

数据随机,所以直接前 \(n-25\) 个数依次考虑,当 \(sum\leq 0\) 时放到第一个集合中,使 \(sum\gets sum+a_i\),\(sum>0\) 反之。这样维护出来差值。

然后枚举后 \(25\) 个数放到哪个集合中,最后使差值变为 \(0\),由于数据随机所以大概率是可以的,但是我跑的时候需要 random_shuffle。找到解直接跳出,卡时输出 -1

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<time.h>
using namespace std;
const int MAXN=2e5+10;
int n,k,a[MAXN],c[MAXN],pos[MAXN];long long now;
void dfs(int x,long long sum,int k)
{
    if(clock()*1.0/CLOCKS_PER_SEC>0.98) cout<<"-1\n",exit(0);
    if(x>min(n,25))
    {
        if(!sum)
        {
            int cnta=0,cntb=0;
            for(int i=1;i<=n;++i)
            {
                if(c[i]==1) ++cnta;
                if(c[i]==2) ++cntb;
            }
            cout<<cnta<<' ';for(int i=1;i<=n;++i) if(c[i]==1) cout<<pos[i]<<' ';cout<<'\n';
            cout<<cntb<<' ';for(int i=1;i<=n;++i) if(c[i]==2) cout<<pos[i]<<' ';cout<<'\n';
            exit(0);
        }
        return ;
    }
    if(k) c[x]=0,dfs(x+1,sum,k-1);
    c[x]=1,dfs(x+1,sum+a[pos[x]],k);
    c[x]=2,dfs(x+1,sum-a[pos[x]],k);
    return ;
}
int main()
{
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
    cin>>n>>k;for(int i=1;i<=n;++i) cin>>a[i],pos[i]=i;
    srand(time(0)),rand();random_shuffle(pos+1,pos+1+n);
    if(n<=25) dfs(1,0,k),cout<<"-1\n",exit(0);
    for(int i=26;i<=n;++i)
    {
        if(now<=0) c[i]=1,now+=a[pos[i]];
        else c[i]=2,now-=a[pos[i]];
    }
    dfs(1,now,25),cout<<"-1\n",exit(0);
}

C.查询工资

感觉情况的考虑很复杂,自己不会比题解说的清楚了,不写了。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=8e5+10;
int T,n,k,fa[MAXN],siz[MAXN],f[MAXN];
vector <int> v[MAXN];
inline void clear()
{
    for(int i=1;i<=n;++i) v[i].clear();
    return ;
}
void dfs(int x,int fa=0)
{
    siz[x]=1,f[x]=0;
    int now=0;bool flag=false;
    for(int y:v[x])
    {
        if(y==fa) continue;
        dfs(y,x);siz[x]+=siz[y],f[x]+=f[y];
        if(siz[y]>=k+1) now=max(now,f[y]+1);
        if(!f[y]&&siz[y]>=2) flag=true;
    }
    flag&=(v[x].size()>=k);
    f[x]=max(f[x]+flag,now);return ;
}
inline void work()
{
    cin>>n>>k;
    for(int i=2;i<=n;++i)
        cin>>fa[i],v[fa[i]].push_back(i);
    dfs(1);cout<<f[1]<<'\n';return ;
}
int main()
{
    freopen("c.in","r",stdin);
    freopen("c.out","w",stdout);
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
    cin>>T;
    while(T--) work(),clear();
    return 0;
}

D.多项式题

设 \(f_i\) 为在 \(i\) 处断开,\(1\sim i\) 所有情况的乘积的和,\(S(i,j)\) 表示 \(i\) 到 \(j\) 组成的数。

有转移:

\[\begin{aligned}f_i &=\sum\limits_{j=0}^{i-1} f_j\times S(j+1,i) \\&= \sum\limits_{j=0}^{i-1} f_j\times (S(j+1,i-1)*10+a_i) \\&=10\times \sum\limits_{j=0}^{i-2} f_j\times S(j+1,i-1)+a_i\times\sum\limits_{j=0}^{i-1} f_j \\&= 10\times f_{i-1}+a_i\times\sum\limits_{j=0}^{i-1} f_j \end{aligned} \]

前缀和优化,O(n)。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=2e5+10,MOD=998244353;
int n;long long f[MAXN],a[MAXN],s[MAXN];
int main()
{
    freopen("d.in","r",stdin);
    freopen("d.out","w",stdout);
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(0);
    cin>>n;s[0]=1;
    for(int i=1;i<=n;++i)
    {
        char ch;cin>>ch;a[i]=ch-48;
        f[i]=(f[i-1]*10%MOD+s[i-1]*a[i]%MOD)%MOD;
        s[i]=(s[i-1]+f[i])%MOD;
    }
    cout<<f[n]<<'\n';return 0;
}

标签:15,NOIP,int,sum,long,times,MAXN,include,模拟
From: https://www.cnblogs.com/int-R/p/NOIP-15.html

相关文章

  • MIPI/DSI转eDP新选择CS5523芯片替代LT8911EXB,IT6151
    ASL(集睿致远)CS5523是一颗MIPIDSI输入,DP/eDP输出转换芯片。MIPI输入4lanes,每lane最大支持1.5Gbps,DP/eDP输出最多支持4lanes,每条lane最大支持2.7Gbps。芯片内部有一个MCU,自带flash。功能框图:特点:MIPIDSI输入和DP/eDP输出支持抖音和6位+FRC。将PWM......
  • 11.8 模拟赛小记
    僕を連れてって,浸み込んでしまう前に菜哭了。不会打,看了半个小时史铁生散文集。100+0+80+0喵。A.俨俨与道路(constructure)正解是最小生成树。我的思路差不多。为了全部联通,需要n-1条边。随意先计算给定的确定起始点的边,根据边权排序,从中挑至少\(n-1-k\)条边。剩下的用......
  • 10.31 模拟赛小记
    抽象场。打完人自闭的那种。得分情况:\(80-0-30-30\)。A:从\(0\)走到\(n\)。在\(i\)位置时,等概率走的走到\([i+1,n]\)(视为一步)。求期望步数。哥们赛时,爆搜打表找规律。。。最后写的O(n),没看到第九个数据点没有特判。对于最后一个点1e18,递推式写出来但不会进一步求。遗憾......
  • 苹果电子iPad Pro系列或推出OLED版,改善PG模拟游戏体验
    在过去的一年中,苹果iPad系列未推出任何新品,然而,明年可能会带来令人振奋的更新。PG游戏软件APP猜测,苹果将进行全面的iPad产品线升级,包括最基础的iPad到高端的iPadPro。其中,最引人瞩目的是采用OLED显示屏的iPadPro,该款产品还将搭载M3芯片,这将是重大升级。根据韩媒的报道,LG、三星和......
  • 即将推出的《深夜拉面》demo游戏版:在PG模拟试玩中倾听客人故事并疗愈心灵
    独立游戏工作室CointinueGames宣布了他们即将在12月中旬推出的《MidnightRamen深夜拉面》(深夜のラーメン)的试玩版。这款游戏将在Steam等平台上推出,并支持简体中文等语言。《深夜拉面》受到了《VA-11Hall-A:CyberpunkBartenderAction赛博朋克酒保行动》和《CoffeeTalk》等游戏......
  • STL之unordered_set与unordered_map的模拟实现(万字长文详解)
    unordered_set与unordered_map的模拟实现哈希节点类#pragmaonce#include<iostream>#include<vector>namespaceMySTL{template<classT>structHashNode{HashNode(constT&data=T())......
  • 2023NOIP A层联测26 总结
    2023NOIPA层联测26总结题目T1origen大意\(n,a_i\leq2\times10^5\)赛时思路一开始想固定一个端点递推去求贡献,发现异或加上平方维护不了递推式,痛失40min。后面多的时间分给T1后接着想做法,考虑拆平方化代数式,然后平方项的因式分解忘了,导致后面一直认为平方项会被加多......
  • 2023NOIP A层联测26 T4 abstract
    2023NOIPA层联测26T4abstract乱证明求性质的光速幂优化题。思路对于每一个节点,到该节点的子树内的叶子节点的路径中(包括路径上的点),出现的值只有\(k\times(\logV+\logV)\)个。那么在以该点为终点,以子树内节点为起点的路径中,取值只有\(k\times(\logV+\logV)\)。这是......
  • 2023NOIP A层联测26 T2 competition
    2023NOIPA层联测26T2competitiontjm的做法,很抽象。考场思路考虑每道题被做过多少次肯定不现实,那么考虑每一道题有多少次没有做出来。假设某一次可以做出来题\(x\)的人是\(i\),而\(i\)下一个人可以做出这道题的人是\(j\),于是题\(x\)有\(C_{j-i}^2\)次不会被做出来......
  • 2023NOIP A层联测26 T3 tour
    2023NOIPA层联测26T3tour有意思的树上主席树。思路首先考虑一个点\(p\)能计入答案的情况,就是\(dis(x,p)-a_p\gea_p\)。我们把\(x\toy\)的路径拆成\(x\tolca,lca\toy\)两条。记录一个点\(x\)到根路径上的前缀和为\(s_x\),对于两条路径,我们分类讨论:第一......