首页 > 其他分享 >Codeforces Round #774 (Div. 2) - E. Power Board

Codeforces Round #774 (Div. 2) - E. Power Board

时间:2022-10-05 13:00:22浏览次数:89  
标签:774 幂次 Power int Codeforces 底数 mp 幂次行 include

枚举 + 数论

Problem - E - Codeforces

题意

有一个 \(n*m\;(1<=n,m<=10^6)\) 的矩阵,第 i 行第 j 列是 \(i^j\), 求这个矩阵中的 \(n*m\) 的数中有多少种不同的数

思路

  1. 第 1 行都是 1;

  2. 和第 2 行 有可能 重复的只可能在 2 的幂次行;

    和第 3 行 有可能 重复的只可能在 3 的幂次行;

    第 4 行在 2 的幂次行中;

    和第 5 行 有可能 重复的只可能在 5 的幂次行;

    和第 6 行 有可能 重复的只可能在 6 的幂次行;

    ...

  3. 因此对于每个底数 \(t\), 只要只要知道 \(t\) 最多有 \(k\) 个幂次行,就可以知道当前的底数控制的这些行中有多少不同的数

    这个底数 \(t\) 对答案的贡献只与 \(k\) 有关,与 \(t\) 是多少无关(因为底数是一样的,只要指数一样就行)

    1 2 3 4 5
    2 2^1 2^2 2^3 2^4 2^5
    4 2^(2*1) 2^(2*2) 2^(2*3) 2^(2*4) 2^(2*5)
    8 2^(3*1) 2^(3*2) 2^(3*3) 2^(3*4) 2^(3*5)
  4. 可以预处理出当某个底数有 \(k\) 个幂次行时,有多少不同的数

    //mp[i]表示有当前的底数有i个幂次行时,这i个幂次行在当前底数下,一共有mp[i]个不同的指数
    //M = 22 表示即使底数是2,也最多有 20 个幂次行
    void presolve()
    {
    	for (int i = 1; i < M; i++)
    	{
    		for (int j = 1; j <= m; j++)
    		{
    			if (!st[i * j])
    			{
    				cnt++;
    				st[i * j] = true;
    			}
    		}
    		mp[i] = cnt;
    	}
    }
    

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>

using namespace std;
#define endl "\n"

typedef long long ll;
typedef pair<int, int> PII;

const int N = 1e6 + 10, M = 22;
int n, m;
int mp[M];//mp[i]表示有当前的底数有i个幂次行时,这i个幂次行在当前底数下,一共有mp[i]个不同的指数
int cnt;
bool st[N * M], vis[N];

void presolve()
{
	for (int i = 1; i < M; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (!st[i * j])
			{
				cnt++;
				st[i * j] = true;
			}
		}
		mp[i] = cnt;
	}
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	presolve();
	ll ans = 1;
	for (int i = 2; i <= n; i++)
	{
		if (vis[i])
			continue;
		int j = 0;
		ll now = i;
		while(now <= n)
		{
			vis[now] = true;
			now *= i;
			j++;
		}
		ans += mp[j];
	}
	cout << ans << endl;
    return 0;
}

标签:774,幂次,Power,int,Codeforces,底数,mp,幂次行,include
From: https://www.cnblogs.com/hzy717zsy/p/16755415.html

相关文章

  • Codeforces Round #785 (Div. 2) - D. Lost Arithmetic Progression
    GCDProblem-D-Codeforces题意有2个等差数列A,B,它们公有的项组成新的等差数列C;现在给出B的(首项,公差,项数)=(b,q,y),C的(首项,公差,项数)=(c,r,z)求满足条件的A的数量,如......
  • CodeForces 1527E Partition Game
    洛谷传送门CF传送门考虑朴素dp:设\(f_{i,j}\)表示分了\(j\)段且第\(j\)段的末尾是\(i\)的最小花费。有转移:\(f_{i,j}\gets\min\limits_{k=0}^{i-1}f_{k,j-1......
  • 欧拉函数的power
    在算数基本定理中有$N=p_{1}^{a1}p_{2}^{a2}p_{3}^{a3}.....p_{k}^{ak}$wuw在y总的课中是用了容斥原理进行推导得到了$\phi(x)=N*(1-\frac{1}{p1})*......
  • Codeforces Educational Codeforces Round 136 C D
    C一开始没有读懂题意,以为是轮流游戏,看别人翻译才发现先手在下一轮会变为反手,导致搞了半天过不了样例。可以知道如果\(n\)这张牌在Alice手中,则Alice先手打出这张牌必胜。......
  • Codeforces Round #824 (Div. 2)
    CodeforcesRound#824(Div.2)A#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#defineendl'\n'usingnamespacestd;intt,n;inlin......
  • Codeforces Round #824赛时情况&赛后总结
    前两天的CF到今天才总结,还是太鸽了呢赛时首先看了题目,由于英语障碍,我还在看A题时,YSC就已经A了(我还是太逊了)。看懂后,发现A是道水题(正常),快速切掉。随后看B,阅读倒没什么障......
  • Codeforces Global Round 22
    题目链接这场彻底打崩了,只做了A,B,C,可以看出我离退役已经不远力!A.GloryAddictstrash题不写。感觉出得很没意思。B.PrefixSumAddicts用\(s_{n-k+1}\sims_n\)......
  • CodeForces 1455G Forbidden Value
    洛谷传送门CF传送门小清新动态开点线段树优化dp题。首先题目中的if嵌套看起来就很烦,可以考虑建树,外面再套一层大的if0...end,这样就将本题转化成一个树上问题。......
  • Codeforces Round #823 (Div. 2) A-D
    比赛链接A题解知识点:贪心。对于一个轨道,要么一次性清理,要么一个一个清理。显然,如果行星个数大于直接清理的花费,那么选择直接清理,否则一个一个清理。即\(\sum\min(c,......
  • 《Power Query数据清洗实战》捉虫……
    先道歉,《PowerQuery数据清洗实战》里,有虫……谢谢大家帮忙捉虫了。 谢谢法叔,他捉了四只……(汗)112页第倒第二行,【追加查询】,应是【合并查询】。151、154、155页,8.3......