首页 > 其他分享 >NOIP2023模拟赛 种树

NOIP2023模拟赛 种树

时间:2023-11-11 18:55:32浏览次数:26  
标签:int ll 样例 枚举 种树 NOIP2023 include 模拟

NOIP2023模拟赛 种树

先整无脑爆搜

#include<iostream>
#include<algorithm>
#include<cstdio>

#define mod %998244353 
#define ll long long

const int N = 1e4 + 10;

using namespace std;

ll n, w;
ll p[N];
ll fy[N], nfy;
ll ans = -1;
int vis[N];

int getInShu(ll x)
{
	if (x >= N)
	{
		int cnt = 0;
		for (int i = 1; i <= x; i++)
		{
			if (x % i == 0) ++cnt;
		}
		return cnt;
	}
	if (vis[x]) return vis[x];
	int cnt = 0;
	for (int i = 1; i <= x; i++)
	{
		if (x % i == 0) ++cnt;
	}
	return vis[x] = cnt;
}

void setFertilizer()
{
	for (int i = 1; i <= w; i++)
	{
		if (w % i == 0)
		{
			fy[++nfy] = i;
		}
	}
}

void dfs(ll sum, ll w, ll now)
{
	if (now == n + 1)
	{
		sum = sum mod;
		ans = max(ans, sum);
		return ;
	}
	for (int i = 1; i <= nfy && fy[i] <= w; i++)
	{
		dfs((sum * getInShu(p[now] * fy[i]))mod , w / fy[i], now + 1);
	}
	dfs((sum * getInShu(p[now]))mod, w, now + 1);
}

int main()
{
	cin >> n >> w;
	for (int i = 1; i <= n; i++)
	{
		cin >> p[i];
	}
	setFertilizer();
	dfs(1, w, 1);
	cout << ans;
	return 0;
}

没啥好说的,就过第一个样例。

看起来很像DP,于是开始推状态转移方程。

DP尝试

状态方程

\(F[i][j]\)为前\(i\)个树木,肥料剩余\(i\)时的最优覆盖距离。

转移方程

肯定是从\(F[i][j * k]\)推过来,但是如果无脑枚举\(k\),第二个样例都过不了。

我发现\(j*k\)必须得是\(w\)的因数,所以第三层循环没必要直接枚举\(k\),而是枚举\(j*k\),即\(w\)的因数,这样大大减少了时间复杂度。

F[0][w] = 1;
for (int i = 1; i <= n; i++)
{
	for (int j = 1; j <= nfy; j++)
	{
		F[i][fy[j]] = (F[i - 1][fy[j]] mod) * (getInShu(p[i]) mod);
		F[i][fy[j]] = F[i][fy[j]] mod;
		for (int k = j + 1; k <= nfy; k++)
		{
			if (fy[k] % fy[j] == 0)
			{
				ll temp = fy[k] / fy[j];
				F[i][fy[j]] = max(((F[i - 1][fy[k]]mod) * (getInShu(p[i] * temp)))mod, F[i][fy[j]]);
				F[i][fy[j]] = F[i][fy[j]] mod;
			}
		}
	}
}

然而第二个样例还是跑得慢,只好从取因数的函数来优化。

这里我发现基础上的一个重要漏洞

我忘记了求一个数的因子数的\(O(\sqrt n)\)方法。

即从一枚举至\(\sqrt n\)即可,因为后面的因子数等同于前面的因子数。

ll getInShu(ll n)
{
    ll ans = 0;
    for(int i=1;i*i<=n;i++)
    {                      
        if(n % i == 0)
        {
            if(n / i == i)
            {          
                ans ++;   
            }   
            else 
            {
            	ans += 2;   	
			}
        }
 	}
	return ans;
}

终于第二个样例短时间内跑过了,然而第三个样例即超时,又答案错误。

感觉时取模和最大值的处理有问题,但是一直改不出来,比赛完发现还mle了,50分,静待讲评。

标签:int,ll,样例,枚举,种树,NOIP2023,include,模拟
From: https://www.cnblogs.com/kdlyh/p/17826185.html

相关文章

  • 54. 替换数字(第八期模拟笔试)
    2023-11-11题目页面(kamacoder.com)54.替换数字(第八期模拟笔试)思路:c++可以用双指针,Java字符串是不能改变的,直接用替换importjava.util.Scanner;classMain{publicstaticvoidmain(String[]args){//Strings="a1b2c3";Scanners......
  • 洛谷NOIP2023模拟赛
    种树题目背景小Rf不是很喜欢种花,但他喜欢种树。题目描述路边有\(n\)棵树,每棵树的高度均为正整数,记作\(p_1,p_2\dotsp_n\)。定义一棵树的宽度为它高度的正因数个数,这些树能覆盖的距离为它们宽度的乘积,你想请你的朋友们来乘凉,但你发现这些树能覆盖的距离不够多。......
  • 「NOIP2023」游记
    day-6今天wx神秘兮兮的叫了四个人出来,说是要参加NOIP不是?!啥?!让我一个提高<200分的sb去参加NOIP?!(并且我提高知识点也并没有学完)炸成狗了要不过后面一周晚自习都要去机房还是不错的当天火急火燎的找了一堆资料,啥也不会(膜拜hqh,初一参加NOIP吊打我等)......
  • python 编程模拟题(一)
    python编程模拟题,要求:源代码可以拍照发给老师,也可以手抄带过来。可以参考之前自己的代码或语法,也可以参考地址的语法讲解:https://www.runoob.com/python/python-basic-syntax.html 1.  获得用户输入的一个字符串,将字符串逆序输出,同时紧接着输出该字符串所包含字符......
  • 【复建笔记】模拟退火
    简述一下我的理解:为什么要有那一行一定概率下接受答案?因为如果没有就会在当前峰下爬山,有的话才能跳到别的峰上,这一行与温度有关,当温度越低,跳的概率越低。退火随机一个二维点:nowx=limx+((rand()<<1)-RAND_MAX)*T;nowy=limy+((rand()<<1)-RAND_MAX)*T;......
  • 力扣2293 暴力模拟
    2293. 极大极小游戏给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。对 nums 执行下述算法:设 n 等于 nums 的长度,如果 n==1 ,终止 算法过程。否则,创建 一个新的整数数组 newNums ,新数组长度为 n/2 ,下标从 0 开始。对于满足 0<=i<n/2 的......
  • NOIP2023模拟16联测37 总结
    NOIP2023模拟16联测37总结\(T1\)求有多少区间的异或和为\(k\)的因子,\(n,k\le10^5\)。看到异或就想到了前几天的拿到按位考虑的题目,想了半小时没想到。突然想前缀和,对每个\(k\)的因子记录一下\(a\oplusk\)的数量就好了。\(T2\)每次可以删去一端的数或删去中间......
  • NOIP2023模拟16联测37 D. 小猫吃火龙果
    NOIP2023模拟16联测37D.小猫吃火龙果目录NOIP2023模拟16联测37D.小猫吃火龙果题目大意思路code题目大意有\(n\)个物品\(A\),\(B\),\(C\),\(A\)吃\(B\),\(B\)吃\(C\),\(C\)吃\(A\),有两种操作,给\([l,r]\)的\(x,y\)互换,求出经过操作后得出什么。\(n,......
  • NOIP2023游记
    记录一下高二参加的最后一场NOIP2023.11.6星期一上完白天文化课后,我着手停课,晚一找了lyh,但是他说停十天课有点长,他得问一下年级部,找zkj,让我们下周一再停,没办法,失败。2023.11.7星期二早读时,lyh跟我说年级部同意停课,开心飞了,但是当天没有信息课,晚上zkj还不在,没时间找他!烦,但是......
  • 意识是如何产生的,如何通过AI技术模拟出来?
    意识是一个复杂而深奥的主题,尽管科学界对于意识的本质仍存在争议,但有一些理论试图解释意识是如何产生的。同时,通过人工智能(AI)技术模拟意识也是一个具有挑战性的课题。在讨论这两个方面之前,让我们首先了解意识的一些主要理论。意识的产生:物理主义: 物理主义认为一切心理现象都......