首页 > 其他分享 >CSP模拟-7

CSP模拟-7

时间:2023-07-28 20:56:20浏览次数:18  
标签:now return ll 模拟 include CSP dp mod

集合专练?????逆天!!!!!!!

T1 卷

逆天!!!!!!!!!!!!!!!!!!!!又没看懂题。独立集指集合里的每个点不相连呜呜呜呜呜,我还以为是剩下的点互不相连,直接寄掉。

式子好推,就不推了,咕。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#define mod 1000000007

using namespace std;

long long n, w[5211314 >> 3], beg;
long long cnt, head[5211314 >> 3], nex[5211314 >> 3], to[5211314 >> 3];
long double comp = 1, val[5211314 >> 3], dp_log[5211314 >> 3][2];
long long dp[5211314 >> 3][2];

inline void AddPoi(int v1, int v2) {
	cnt ++;
	nex[cnt] = head[v1];
	head[v1] = cnt;
	to[cnt] = v2;
	return;
} 

void DFS(int fa, int now) {
	dp_log[now][1] = val[now];
	dp[now][1] = w[now];
	for (int i = head[now]; i != 0; i = nex[i]) {
		if (to[i] != fa) {
			DFS(now, to[i]);
			if (dp_log[to[i]][0] > dp_log[to[i]][1]) {
				dp_log[now][0] += dp_log[to[i]][0];
				dp[now][0] = dp[now][0] * dp[to[i]][0] % mod;
			}
			else {
				dp_log[now][0] += dp_log[to[i]][1];
				dp[now][0] = dp[now][0] * dp[to[i]][1] % mod;
			}
			dp_log[now][1] += dp_log[to[i]][0];
			dp[now][1] = dp[now][1] * dp[to[i]][0] % mod;
		}
	}
	//dp式子好推,就不多BB了 
	return;
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; ++ i) {
		dp[i][0] = 1;
	}
	for (long long i = 1; i <= n; ++ i) {
		cin >> w[i];
		val[i] = log(w[i]);
		//一定要记住啊啊啊啊啊啊啊啊,乘法就转换成log的加 
	}
	for (long long i = 1; i <= n - 1; ++ i) {
		long long u, v;
		cin >> u >> v;
		AddPoi(u, v), AddPoi(v, u);
	}
	DFS(1, 1);
	//记得判断QAQ 
	if (dp_log[1][0] > dp_log[1][1]) {
		cout << dp[1][0] << endl;
	}
	else {
		cout << dp[1][1] << endl;
	}
	return 0;
}

T2 简单题

确实够简单奥。。。。。

将每个是双倍的点连边,判断链长,处理,咕

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define mod 10000019

using namespace std;
typedef long long ll;

ll base[67], n ,q, basic, m, fac[5211314 << 1], inv[5211314 << 1];
ll sum1, sum2;

inline ll QuickPower(ll a, ll k) {
	ll base = a, ans = 1;
	while (k != 0) {
		if (k & 1 == 1) {
			ans = ans * base % mod;
		}
		base = base * base % mod;
		k >>= 1;
	}
	return ans;
}

inline ll GetInv(ll x) {
	if (x == 1 || x == 0) return 1;
	return (mod - mod / x) * (GetInv(mod % x)) % mod;
}

inline ll GetC(ll a, ll b) {
	if (a < b) return 0;
	else return (fac[a] * GetInv(fac[a - b])) % mod * GetInv(fac[b]) % mod;
}

ll Lucas(ll a, ll b) {
	if (b == 0)  {
		return 1;
	}
	return Lucas(a / mod, b / mod) * GetC(a % mod, b % mod) % mod;
}

int main() {
	scanf("%lld%lld", &n, &q);
	fac[0] = 1;
	for (ll i = 1; i <= mod; ++ i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	base[0] = 1;
	for (ll i = 1; i <= 60; ++ i) {
		base[i] = base[i - 1] * 2 % (int)4e18;
	}
	double k = log(n)/log(2);
	for (ll i = 0 ; i <= k; ++ i) {
		ll l = n / base[i + 1], r = n / base[i], temp;
		l += 1;
		if (l % 2 == 1) {
			temp = (r - l) / 2 + 1;
		}
		else if (l % 2 == 0) {
			if (r % 2 == 1) temp = (r - l) / 2 + 1;
			else temp = (r - l) / 2;
		}
		basic += (i + 1) / 2 * temp;
		if ((i + 1) % 2 == 0) {
			sum1 += temp;
		}
		else {
			sum2 += temp;
		}
	}
	while (q --) {
		scanf("%lld", &m);
		if (m < basic) cout << 0 << endl;
		else {
			cout << QuickPower(2, sum1) % mod * Lucas(sum2, m - basic) % mod << endl;
		}
	}
	return 0;
} 

T3 粉丝

在取的数中,每次可做的操作有两种:

  1. 插入\(\sqrt{n}\)
  2. 将所有选的数都加一

这样就保证了每种选择方式都能出现,如我们要找 \(\sqrt{n}\) 和 \(\sqrt{n}+3\) 的排列,则可以先插入 \(\sqrt{n}\) 再加两次 \(1\) 然后插一次 \(\sqrt{n}\) 就行

逆天根号分治,总之就是不太会就对了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define mod 10000019

using namespace std;
typedef long long ll;

ll base[67], n ,q, basic, m, fac[5211314 << 1], inv[5211314 << 1];
ll sum1, sum2;

inline ll QuickPower(ll a, ll k) {
	ll base = a, ans = 1;
	while (k != 0) {
		if (k & 1 == 1) {
			ans = ans * base % mod;
		}
		base = base * base % mod;
		k >>= 1;
	}
	return ans;
}

inline ll GetInv(ll x) {
	if (x == 1 || x == 0) return 1;
	return (mod - mod / x) * (GetInv(mod % x)) % mod;
}

inline ll GetC(ll a, ll b) {
	if (a < b) return 0;
	else return (fac[a] * GetInv(fac[a - b])) % mod * GetInv(fac[b]) % mod;
}

ll Lucas(ll a, ll b) {
	if (b == 0)  {
		return 1;
	}
	return Lucas(a / mod, b / mod) * GetC(a % mod, b % mod) % mod;
}

int main() {
	scanf("%lld%lld", &n, &q);
	fac[0] = 1;
	for (ll i = 1; i <= mod; ++ i) {
		fac[i] = fac[i - 1] * i % mod;
	}
	base[0] = 1;
	for (ll i = 1; i <= 60; ++ i) {
		base[i] = base[i - 1] * 2 % (int)4e18;
	}
	double k = log(n)/log(2);
	for (ll i = 0 ; i <= k; ++ i) {
		ll l = n / base[i + 1], r = n / base[i], temp;
		l += 1;
		if (l % 2 == 1) {
			temp = (r - l) / 2 + 1;
		}
		else if (l % 2 == 0) {
			if (r % 2 == 1) temp = (r - l) / 2 + 1;
			else temp = (r - l) / 2;
		}
		basic += (i + 1) / 2 * temp;
		if ((i + 1) % 2 == 0) {
			sum1 += temp;
		}
		else {
			sum2 += temp;
		}
	}
	while (q --) {
		scanf("%lld", &m);
		if (m < basic) cout << 0 << endl;
		else {
			cout << QuickPower(2, sum1) % mod * Lucas(sum2, m - basic) % mod << endl;
		}
	}
	return 0;
} 

总结

T1从第一次到现在就没读过懂题,但暴力总能骗一骗,总是出现能有正解思路但不知道接下来怎么做的情况。

标签:now,return,ll,模拟,include,CSP,dp,mod
From: https://www.cnblogs.com/jueqingfeng/p/17588878.html

相关文章

  • CSP模拟-8
    今天T1终于看懂辣。。。。但今天名次最低QAQ。T1没算空间复杂度,直接炸QAQT1Coprime2今天T1确实简单,将输入的数的质数公因数用埃氏筛筛出来,用一个数组存下来。每次将质因数的倍数用\(flag\)存下\(true\),表示这个数存在因数与输入的数重复的情况,让后就没有辣。正确性的话:......
  • CSP模拟8
    闲话今天老吕从国赛,带来一个消息:“省选可能取消,完全看NOIP成绩”。不过对我没什么影响,反而还开心一些。A.Coprime题目大意给定一个长度为\(n\)的数列\(a\),要求出\(1\simm\)中与\(a\)中的所有元素互质的数。数据范围:\(1\\leq\n,m\\leq\10^5,1\\leq\a_i\\l......
  • 「赛后总结」暑假集训:20230727 CSP 模拟赛
    「赛后总结」20230727CSP模拟赛点击查看目录目录「赛后总结」20230727CSP模拟赛总结题解T1卷T2简单题T3粉丝T4字符串已经入园两年了吗。好快哦。2023年7月28日20:04:早上就写完了但忘了发了。以下内容均写于「2023年7月27日」。前两天题还没改完呢,有......
  • wpf在设计器模式利用模拟数据展现控件
    使用VisualStudio开发WPF应用程序时,控件显示需要的数据如果来路比较“苦难”,比如来自数据库,JSON文件,复杂计算等,这时候,如果想看到控件带有数据的展示效果,需要启动调试,这很麻烦。我们可以在XAML中使用designtime语法给控件赋予模拟数据MSDN教程,也可以在后台使用csharp代码判断当......
  • c# WinForm 引用 Chrome 模拟操作
    Nuget CefSharp.WinForms publicForm1(){InitializeComponent();chromiumWebBrowser1.LoadingStateChanged+=ChromiumWebBrowser1_LoadingStateChanged;}privatevoidbutton1_Click(objectsender,EventArgs......
  • Window系统下模拟Linux环境的工具
    [b][color=red]强大的Cygwin[/color][/b]:[url]http://cygwin.com/install.html[/url]OracleunderCygwin-EduUnix[url]http://eduunix.ccut.edu.cn/index2/html/oracle/O'Reilly%20-%20Perl.For.Oracle.DBAs.eBook-LiB/oracleperl-CHP-2-SECT-4.......
  • Android shell模拟物理按键
    Androidshell模拟物理按键在Android开发中,有时候我们需要模拟物理按键的操作,例如模拟点击返回键、Home键等。Android提供了一个能够在命令行中模拟按键操作的工具——input。input命令简介input命令是Android系统中的一个工具,用于模拟按键事件。通过使用不同的参数,我们可以模拟......
  • 济南 CSP-J Day 4
    SolutionT1出现次数原题链接4102:出现次数简要思路利用类似前缀和的“后缀和”来记录下每个数后面有几个未重复出现的数,定义一个\(f\)数组来判断是不是第一次出现(实现去重)。完整代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constint......
  • CSP 模拟 6
    T1排序基本是原题CF1375E好像是简单题,考虑这个排列\(\pi\)的逆排列\(\pi^{-1}\)(如果排列是\(a_i\),则逆排列为\(b_{a_i}=i\)),因为逆序对的定义是序列编号和数值大小关系不一样,所以在逆排列中逆序对和原排列相同,对逆排列做冒泡排序,因为冒泡排序交换的是相邻值的位置,对其他值......
  • CSP模拟7
    A.卷一道可爱的树形DP喵!题目保证了\(w_i\)是在给定范围内随机生成的,所以不会炸精度。首先明确题意,是求出最大乘积独立集之后取模,而不是边乘边取模。边乘边取模会炸,例如\(10^9+8\)对\(10^9+7\)取模后小于\(2\),但显然\(10^9+8>2\)。那怎么办呢?高精?可以用我们......