首页 > 其他分享 >「模拟赛」NOIP2024 模拟 2

「模拟赛」NOIP2024 模拟 2

时间:2024-11-06 19:57:36浏览次数:1  
标签:pri 号点 先手 num 模拟 位为 NOIP2024 define

Rank 14,190 pts

比赛链接

新的阶乘

容易发现只需要处理 1~n 的质因子分解即可,每个数 \(i\) 本来有 \(n-i+1\) 个

我们在欧拉筛的过程中同时维护每个数的一个质因子 \(pri\)

每次从 \(n\) 到 1 把遇到的非质数 \(i\) 现有的个数加到他的质因子 \(pri_i\) 和 \(\frac{i}{pri_i}\) 上

这样最后只会剩下质数里是有数的,就是答案

code
#include<bits/stdc++.h>
#define Aqrfre(x, y) freopen(#x ".in", "r", stdin),freopen(#y ".out", "w", stdout)
#define mp make_pair
#define Type int
#define qr(x) x=read()
typedef long long ll;
using namespace std;

inline Type read(){
    char c=getchar(); Type x=0, f=1;
    while(!isdigit(c)) (c=='-'?f=-1:f=1), c=getchar();
    while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48), c=getchar();
    return x*f;
}

const int N = 1e7 + 5; 
const int M = 7e5 + 5;

int n, pri[M], a[N], cnt;
bool ifpri[N]; ll num[N], f[N];
int nxt[N], to[N];

inline void Euler(){
	for(int i=2; i<=n; i++){
		if(!a[i]){
			pri[++cnt] = i;
			a[i] = i;
		}
		for(int j=1; j<=cnt; j++){
			if(1ll * i * pri[j] > n or pri[j] > a[i]) break;
			a[i*pri[j]] = pri[j];
		}
	}
    for(int i=1; i<=cnt; i++)
        ifpri[pri[i]] = true, nxt[pri[i]] = pri[i+1];
}

signed main(){ // factorial
    Aqrfre(factorial, factorial);

    qr(n); Euler();

    for(int i=2; i<=n; i++) num[i] = n - i + 1;
    
    for(int i=n; i>=2; i--){
        if(ifpri[i]) continue;
        num[a[i]] += num[i]; num[i/a[i]] += num[i];
    }

    cout<<"f("<<n<<")"<<"=";
    for(int i=1; i<=cnt; i++){
        if(i != 1) cout<<"*";
        cout<<pri[i];
        if(num[pri[i]] > 1) cout<<"^"<<num[pri[i]];
    }



    return 0;
}

博弈树

先放下好说的结论:起点作根时,如果以起点作为一个端点的所有最长链都在这个点的一颗子树内,则先手必胜,否则先手必败

证明如下:

  • 先手必败:如下图,发现先手跳到 1 号点,那么后手一定可以绕过跟跳到 3 号点;若跳到 2 号点或者 5 号点,后手可以跳到 4 号点

    后手一定可以跳到跨过根节点的和先手对称的点,所以只要先手能跳后手就能跳

  • 先手必胜:如下图,先手直接跳到 1 号点,此时如果后手继续向下跳的话相当于先后手互换,仍同以上情况(互换后的先手必败);
    而若后手向上走到 3 号点,先手再走到 4 号点便可以让后手无路可走,所以先手必胜。

发现以上结论等价于如下:

  • 树只有一个重心的时候,只有重心的位置有后手胜,其余都是先手胜;
  • 树有两个重心的时候,全是先手胜。

划分

考虑两种情况:

  • 前 \(k\) 位没有 1:那么一定是从第一个 1 开始到最后为一段,第一个 1 之前的数(设有 \(q\) 个)分成至少 \(k-1\) 段,方案数用插板法易得为 \(\sum_{i=k-1}^qC_{q-1}^{i-1}\)

  • 前 \(k\) 位有 1:那么最优答案一定是最高位为 1 且共有 \(n-k+1\) 位,也就是说选出组合起来的值最大的 \(n-k+1\) 作为一段,其余的分成 \(k-1\) 段长度为 1 的;

    易证:前 \(k\) 位有 1,所以可以做到有 \(n-k+1\) 位的数最高位为 1,此时若位数减少一位,则原数左移一位,至少减少 1,减去的那一位若是一,最多增加 1,所以直接选 \(n-k+1\) 位一定不劣

    所以可以用最“大”表示法或者二分哈希(下文中细说)找出长度为 \(n-k+1\) 的值最大的字符串,方案数也是哈希找出从高到低前 \(n-k\) 位与这个数相等的个数。

    为什么是前 \(n-k\) 位:若最大值第 \(n-k+1\) 位为 0,则前 \(n-k\) 位相等两数一定相同;若最大值第 \(n-k+1\) 位为 1,则前 \(n-k\) 位相同,无论第 \(n-k\) 位是不是 1,这种划分也一定是最优的,因为第 \(n-k\) 位是 1 对答案的贡献增加 1,不是 1 它也会以自己成一段的方式对答案贡献 1.

二分哈希:枚举起点,维护当前找到的值最大的起点,二分找到 当前枚举的起点构成的字符串 和 值最大的起点构成的字符串 第一个不一样的位,判断大小即可判断出两个字符串的大小

标签:pri,号点,先手,num,模拟,位为,NOIP2024,define
From: https://www.cnblogs.com/YuenYouth/p/18530684

相关文章

  • 【考试题解】NOIP2024加赛2
    目录A.新的阶乘(factorial)题目内容部分分?pts正解思路代码B.博弈树(tree)题目内容部分分80pts正解思路代码C.划分(divide)题目内容部分分10pts14pts正解思路代码D.灯笼(lantern)A.新的阶乘(factorial)题目内容定义运算\(f(x)=x^1\times(x-1)^2\times(x-2)^3\dots2^{x-1......
  • noip模拟7
    新的阶乘考虑从这个式子下手,怎么更优秀的求得答案。\[\begin{aligned}f(x)&=x_1\times(x-1)^2\times(x-2)^3...2^{x-1}\times1^x\\&=\prod_{k=0}^{x-1}(x-k)^{k+1}\\&=x!\times\prod_{k=0}^{x-2}(x-1-k)^{k+1}\\&=x!\timesf(x-1)\\&=\prod_{k=1}......
  • NOIP2024加赛2
    NOIP2024加赛2题目来源:2023NOIPA层联测18\(T1\)HZTG5733.新的阶乘\(100pts\)预处理素数后直接对\(1\simn\)进行质因数分解因为有太多冗余枚举导致无法通过。考虑枚举最终形式。具体地,从质因数的角度入手,设当前枚举的质数为\(p\),暴力求出\(ip\)中\(p\)的指......
  • [2024.11.06]NOIP 模拟赛
    不会tarjan不会广义串并联图……赛时T1看上去很可做。看到中位数首先想到二分。在二分的背景下,问题转化为求当前最多能使多少个元素大于等于某个定值。我们不妨先让所有的元素都选择\(a\)值,然后相当于要选择一段连续的\(b\)替换一些\(a\),要求最后总和最大。所以可以新设......
  • 11.6 模拟赛
    A.大副令\(m\)的最高一位\(1\)在\(k\)上。构造\(\lfloorn/2\rfloor\)个\(2^k\),\(n-\lfloorn/2\rfloor\)个\(2^k-1\),即可达到答案上界\((2^{k+1}-1)\times\lfloorn/2\rfloor\times(n-\lfloorn/2\rfloor)\)。B.机械师首先小甜水糖水不等式。多人同时破......
  • 7.7 g(x)=(10a)/(10b+(a-10b)e^(asinx)),取a=1.1,b=0.01,计算x=1,2,...,20时,g(x)对应的函
    importnumpyasnpimportmatplotlib.pyplotaspltfromscipy.optimizeimportcurve_fit,leastsq,least_squaresfromscipy.constantsimportedefg(x,a,b):return(10*a)/(10*b+(a-10*b)*np.exp(a*np.sin(x)))a=1.1b=0.01x_values=np.......
  • 1105模拟
    \(T1\),注意对白三角形进行搜索,每次搜到曾经走过点判断能否构成三角形是错的,我本来以为我是从总三角形中去掉每条白边影响那里错了。这启示我们什么?即使对看起来最简单的地方也要进行严谨证明,不要一眼过。然后可以想总三角形减异色三角形,就能做了\(T2\),注意如果要进行搜索,枚......
  • CSP2024 前集训:NOIP2024加赛 1
    前言赛时本来rk3,赛后自己加hack卡自己于是成rk4了。因为这场是假做法大战,T1假贪心有\(92pts\);T2\(O(n^2m)\)能过(是因为数据里\(m\le10\));T3相当抽象,赛时我打的爆搜只加了一个剪枝能得\(70pts\),赛后发现无解的时候会跑满,于是提前判掉无解就过了甚至最优解\(30ms\)......
  • 多校A层冲刺NOIP2024模拟赛18
    多校A层冲刺NOIP2024模拟赛18\(T1\)A.选彩笔(rgb)\(100pts/100pts\)观察到\(0\ler,g,b\le255\)且答案具有单调性,故考虑二分答案。将\(r,g,b\)分别抽象成三维坐标下的\(x,y,z\)。设当前二分出的答案为\(mid\),由调整法分析可知若存在一个边长为\(mid\)的......
  • NOIP模拟(flandre、meirin、sakuya、scarlet) - 模拟赛总结
    flandre做得挺久的,大约做了\(\rm1h+\)。首先,选出来的序列一定是升序的,因为交换升序序列中的任意两个都不可能让「感觉效果」更高。然后来看选那些数组成这个序列。接下来是我赛时的想法:如果全为正数,那么自然正数全部都得选。需要考虑的是负数的情况。首先,选择一个负数不仅......