视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
CodeforcesRound#232(Div.2)
2020-11-09 07:39:07 责编:小采
文档


Problems # Name A On Segment's Own Points standard input/output 1 s, 256 MB x1657 B On Corruption and Numbers standard input/output 1 s, 256 MB x925 C On Number of Decompositions into Multipliers standard input/output 1 s, 256 MB x181 D On

Problems

# Name
A

On Segment's Own Points

standard input/output

1 s, 256 MB

x1657
B

On Corruption and Numbers

standard input/output

1 s, 256 MB

x925
C

On Number of Decompositions into Multipliers

standard input/output

1 s, 256 MB

x181
D

On Sum of Fractions

standard input/output

2 s, 256 MB

x134
E

On Changing Tree

standard input/output

2 s, 256 MB

x34


A题:n个区间,你可以选择第一个区间上的位置,后面n-1行是被占掉的区间,求你最多能占多长的区间。

思路:n才100,直接暴力,把出现过的区间标记掉,最后去遍历一遍即可。

B题:你有l-r的硬币,要组合出x的钱,问能否组合。

思路:可以的区间为1*[l,r], 2 * [l,r], 3 * [l,r]....直到后面区间重合了之后都是一直可以的,所以用x / l求出i。然后乘上r判断n在不在区间内即可。

C题:m是a1*a2*a3..*an。问m有几种分解成n个数相乘的不同方法。

思路:先分解所有a的分解成质因子,然后等同于把质因子放入n个位置去,用隔板法,每个质因子的方法为C(n - 1 + k) (n - 1)种,k为该质因子个数。

D题:求出题目给定公式值。

思路:先推公式1/u(i) * 1/v(i) = 1/(v(i) - u(i)) * (1/v(i) - 1/u(i))。如此一来前面每一项等于(1/2 - 1/3) + (1/3 - 1/5) + (1/5 - 1/7).....(1/m - 1/n) = 1/2 - 1/n。然后关键就变成找出n的上下质数,这步用暴力枚举,直到是质数为止。然后求出总和即可。

E题:n个点的有根树,根为1,操作1在v结点添加,距离为i的子节点添加值为x - i * k。2为询问。

思路:树状数组,在添加的时候,先假设是从根添加,这样要多添加k * dep[v]。然后开2个树状数组一个记录sum和一个记录k。这样一来最后答案变为

sum - k * dep[v];

代码:

A:

#include 
#include 
#include 
using namespace std;
const int N = 105;
int n, i, vis[N], l, r, ll, rr;

int main() {
 scanf("%d", &n);
 scanf("%d%d", &ll, &rr);
 for (i = 2; i <= n; i++) {
 scanf("%d%d", &l, &r);
 for (int j = l; j < r; j++)
 vis[j] = 1;
 }
 int ans = 0;
 for (i = ll; i < rr; i++) {
 if (!vis[i])
 ans++;
 }
 printf("%d\n", ans);
 return 0;
}

B:

#include 
#include 

int t;
__int n, l, r, i;

bool solve() {
 if (n < l) return false;
 __int k = n / l;
 if (n <= r * k) return true;
 return false;
}

int main() {
 scanf("%d", &t);
 while (t--) {
 scanf("%Id%Id%Id", &n, &l, &r);
 printf("%s\n", solve()?"Yes":"No");
 }
 return 0;
}

C:

#include 
#include 
#include 
#include 
using namespace std;

const int MOD = 1000000007;
const int N = 505;
const int MAXN = 20005;
int n, a, cnt = 0, num[MAXN], c[20005][1005];
map v;

void getnum(int x) {
	for (int i = 2; i * i <= x; i++) {
	while (x % i == 0) {
	if (v.count(i)) {
	num[v[i]]++;
	x /= i;
	}
	else {
	v[i] = ++cnt;
	num[v[i]]++;
	x /= i;
	}
	}
	}	
	if (x == 1) return;
	if (v.count(x)) {
	num[v[x]]++;
	}
	else {
	v[x] = ++cnt;
	num[v[x]]++;
	}
}

void init() {
	c[0][0] = 1;
	for (int i = 1; i <= 17000; i++)
	for (int j = 0; j <= i && j <= 1000; j++)
	if (j == 0 || j == i) c[i][j] = 1;
	else c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD;
}

__int cal(int k) {
	return c[k + n - 1][n - 1];
}

__int solve() {
	__int ans = 1;
	for (int i = 1; i <= cnt; i++) 
	ans = ans * cal(num[i]) % MOD;
	return ans;
}

int main() {
	init();
	scanf("%d", &n);
	for (int i = 0; i < n; i++) {
	scanf("%d", &a);
	getnum(a);
	}
	printf("%Id\n", solve());
	return 0;
}

D:

#include 
#include 

const int MAXN = 100005;
int t;
__int n, l, r, prime[MAXN], vis[MAXN], pn = 0;

void init() {
	for (int i = 2; i <= 100000; i++) {
	if (vis[i]) continue;
	prime[pn++] = i;
	for (int j = i; j <= 100000; j += i)
	vis[j] = 1;
	}
}

bool judge(int x) {
	for (int i = 0; i < pn; i++) {
	if (x % prime[i] == 0 && x != prime[i])
	return false;
	}
	return true;
}

__int find_l(__int x) {
	while (1) {
	if (judge(x))
	return x;
	x--;
	}
}

__int find_r(__int x) {
	x++;
	while (1) {
	if (judge(x))
	return x;
	x++;
	}
}

__int (__int a, __int b) {
	if (b == 0) return a;
	return (b, a%b);
}
void print(__int l, __int r) {
	__int zi = (l - 2) * r + (n - l + 1) * 2, mu = l * r * 2;
	printf("%Id/%Id\n", zi / (zi, mu), mu / (zi, mu));
}

int main() {
	init();
	scanf("%d", &t);
	while (t--) {
	scanf("%d", &n);
	l = find_l(n); r = find_r(n);
	print(l, r);
	}
	return 0;
}

E:

#include 
#include 
#include 
using namespace std;
const int N = 300005;
const int MOD = 1000000007;
int n, Q, i, nod, vis[N];
__int kbit[N], sbit[N], cnt = 0, l[N], r[N], dep[N];
vector g[N];
void dfs(int u, __int d) {
 vis[u] = 1; dep[u] = d;
 cnt++; l[u] = cnt;
 for (int i = 0; i < g[u].size(); i++) {
 int v = g[u][i];
 if (vis[v]) continue;
 dfs(v, d + 1);
 }
 r[u] = cnt;
}

void Is(__int value, int x, __int *num) {
 while (x <= N) {
 num[x] = (num[x] + value) % MOD;
 x += (x&(-x));
 }
}

__int Sum(int x, __int *num) {
 __int ans = 0;
 while (x > 0) {
 ans = (ans + num[x]) % MOD;
 x -= (x&(-x));
 }
 return ans;
}

int main() {
 scanf("%d", &n);
 for (i = 2; i <= n; i++) {
 scanf("%d", &nod);
 g[nod].push_back(i);
 }
 dfs(1, 0);
 scanf("%d", &Q);
 while (Q--) {
 int type, v;
 scanf("%d%d", &type, &v);
 if (type == 1) {
 __int x, k;
 scanf("%Id%Id", &x, &k);
 __int val = (x + dep[v] * k) % MOD;
 Is(k, l[v], kbit);
 Is(-k, r[v] + 1, kbit);
 Is(val, l[v], sbit);
 Is(-val, r[v] + 1, sbit);
 }
 else printf("%Id\n", ((Sum(l[v], sbit) - dep[v] * Sum(l[v], kbit)) % MOD + MOD) % MOD);
 }
 return 0;
}

下载本文
显示全文
专题