日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

2023.11.11 模拟赛

發(fā)布時間:2023/11/18 windows 51 coder
生活随笔 收集整理的這篇文章主要介紹了 2023.11.11 模拟赛 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2023.11.11 模擬賽復(fù)盤

前記

通過四個半小時的努力,得到了 41pts / 400pts 的高分。

當時心態(tài)很爆炸,經(jīng)過不斷的反思,發(fā)現(xiàn)自己比賽意識太差,暴力打不出,正解想出來 tmd 不會寫,這就是最大的問題。

所以以后要多打比賽還得多復(fù)盤。

比賽鏈接

洛谷 NOIP 2023 模擬賽

T1 種樹

簡化題意:

給定 \(n\) 個正整數(shù) \(p_1, p_2,\dots,p_n\)\(w\),請你將每個 \(p_i\) 擴大 \(d_i~(d_i\ge1)\) 倍并且 \((\prod\limits_{i=1}^{n}d_i)=w\)。設(shè) \(g_i\) 表示 \(p_i\) 的正因數(shù)個數(shù),求出最大化的 \(\prod\limits_{i=1}^{n}g_i\),并對 \(998244353\) 取模。

對于任意正整數(shù) \(p\) ,都可以表示成:\(p=\prod\limits_{i=1}^{m}a_i^{k_i}\)\(k_i\ge1\)\(a_i\) 為互不相同的質(zhì)數(shù))。

由因數(shù)定理,不難想到 \(g_i =\prod\limits_{i=1}^{m}k_i+1\)(每個 \(a\) 的次數(shù)有 \(k+1\) 種取法)。

那么對于這個題,我們可以得到貪心策略如下:

  • 如果對于質(zhì)數(shù) \(k\),序列 \(p\) 中每一個數(shù)都有一個因子為 \(k\)(我們稱此情況為條件 A),那么就將 \(w / k\),并且將序列中含有 \(k\) 的指數(shù)最小的那個數(shù)乘上 \(k\)

  • 如果不是條件 A,對于答案直接翻倍即可。

Code:

#include <bits/stdc++.h>

#define rint register int
#define int long long
#define endl '\n'

using namespace std;

const int N = 1e4 + 5;
const int mod = 998244353;

int n, w;
int a[N];
int ans = 1;
priority_queue<int, vector<int>, greater<int> > q;

void calc(int x, int s)
{
    int cnt;
	for (rint i = 1; i <= n; i++)
    {
        cnt = 0;
        while (a[i] % x == 0)
		{
			cnt++;
			a[i] /= x;
		} 
        q.push(cnt + 1);
    }
    while (s > 0) 
    {
        int x = q.top(); 
		q.pop();
        q.push(x + 1);
		s--;
    }
    for (rint i = 1; i <= n; i++)
	{
		ans = ans * q.top() % mod;
		q.pop();
	} 
}

signed main()
{
    cin >> n >> w;
    
    for (rint i = 1; i <= n; i++)
    {
		cin >> a[i];
	}
	
    for (rint i = 2; i * i <= w; i++)
	{
        if (w % i == 0)
        {
            int cnt = 0;
            while (w % i == 0)
			{
				cnt++;
				w /= i;
			} 
            calc(i, cnt);
        }		
	} 

    if (w > 1) calc(w, 1);
    
    for (rint i = 1; i <= n; i++)
    {
    	/*
		這一步?jīng)]有必要判斷 j 一定是質(zhì)數(shù)
		舉個例子, 如果 2 不行, 那么 2 的倍數(shù)一定也不行
		*/
        for (rint j = 2; j * j <= a[i]; j++)
        {
            int cnt = 0;
            while (a[i] % j == 0)
			{
				a[i] /= j;
				cnt++;
			} 
            ans = ans * (cnt + 1) % mod;
        }
        if (a[i] > 1) 
		{
			//cout << a[i] << " ";
			ans = ans * 2 % mod;
		}
    }
    
    cout << ans << endl;
    
    return 0;
}

T2 汪了個汪

簡化題意:構(gòu)造一個邊長為 \(n\) 的數(shù)字三角形,滿足相鄰兩個數(shù)組成的無序數(shù)對只出現(xiàn)一次,并且每行開頭數(shù)字不同,每行數(shù)字不同,只包含 \(1\)\(n\) 的數(shù)字。

這個題有很多種構(gòu)造方案,在這里記錄最簡單的一種。

一般來說這種傻逼構(gòu)造題對于 \(n\) 為偶數(shù)情況來說比較好入手,我們先來打個表搓一下:

1       1           1
2 1     2 4         2 4
        3 1 4       3 1 5
        4 3 2 1     4 6 2 5
                    5 3 6 1 4
                    6 5 4 3 2 1

通過瞪眼法,不難發(fā)現(xiàn),這個三角形是沿著斜邊高對稱的對吧。我們現(xiàn)在砍掉一半:

1       1           1
2       2 4         2 4
        3 1         3 1 5
        4           4 6 2
                    5 3
                    6

接著瞪眼法,我們大概猜一下,對于偶數(shù)情況如何構(gòu)造:

  • 1.第一列,一定是 \(1,2,3,....n\)

  • 2.對于 \(n\) 所構(gòu)造的數(shù)字三角形,它一定可以由 \(n - 2\) 所構(gòu)造的數(shù)字三角形推過來

  • 3.除了最右邊一列,下面添加的兩個數(shù)都是這個數(shù)上方兩個數(shù)加 \(2\)

考慮奇數(shù)如何構(gòu)造。

先看 \(n = 5\)

1
2 4
3 1 5
4 5 2 3
5 3 4 1 2

我們再猜一個結(jié)論:

  • 1.第一列,一定是 \(1,2,3,....n\)
  • 2.沿著斜邊高對稱,但是,這個對稱是指,\(1\) 換成 \(2\)\(2\) 換成 \(1\),其余同理

然后就和偶數(shù)一樣了,因為我們對于 \(n=5\),只需要找出

1
2 4
3 1 
4 

就可以確定它了。

該結(jié)論正確性我們就堅信它是對的就可以了。

#include <bits/stdc++.h>

#define rint register int
#define int long long
#define endl '\n'

using namespace std;

const int N = 5e3 + 5;

int n;
int a[N][N];

signed main()
{
	cin >> n;
	
	for (rint i = 1; i <= n / 2; i++)
	{
		for (rint j = 1; j <= i; j++)
		{
			int k = i & 1;
			if (j < i)
			{
				a[i * 2 - j][j]     = a[i * 2 - j - 2][j] + 2;
				a[i * 2 - j + 1][j] = a[i * 2 - j - 1][j] + 2;
			}
			else
			{
				a[i * 2 - j][j]     = i * 2 - k;
				a[i * 2 - j + 1][j] = k + 1;
			}
		}
	}
	
	if (n & 1)
	{
		for (rint i = 1; i <= n / 2 + 1; i++)
		{
			a[n + 1 - i][i] = n;
		}
		
		for (rint i = 1; i <= n; i++)
		{
			for (rint j = 1; j <= min(i, n - i); j++)
			{
				a[n + 1 - j][n + 1 - i] = a[i][j] & 1 ? a[i][j] + 1 : a[i][j] - 1;
			}
		}
	}
	
	else
	{
		for (rint i = 1; i <= n; i++)
		{
			for (rint j = 1; j <= min(i, n + 1 - i); j++)
			{
				a[n + 1 - j][n + 1 - i] = a[i][j];
			}
		}
	}
	
	for (rint i = 1; i <= n; i++)
	{
		for (rint j = 1; j <= i; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	
	return 0;
}

總結(jié)

以上是生活随笔為你收集整理的2023.11.11 模拟赛的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。