首页 > 其他分享 >模板-质因子分解

模板-质因子分解

时间:2024-10-16 12:43:22浏览次数:6  
标签:std vector int factor 因子 分解 ans 模板

版本1:求n的所有质因子,时间复杂度O(sqrt(n))。

// 例如:12=2*2*3,那么
// factor(12, 1) => {2,3}
// factor(12, 0) => {2,2,3}
std::vector<int> factor(int n, int removeDup) {
    std::vector<int> ans;
    for (int i = 2; i <= n/i; i++) {
        while (n % i == 0) {
            ans.push_back(i);
            n /= i;
        }
    }
    if (n > 1) ans.push_back(n);
    if (removeDup)
        ans.erase(std::unique(ans.begin(), ans.end()), ans.end());
    return ans;
}

版本2:求n的所有因子,时间复杂度O(sqrt(n))。

// 例如:12的因子有:1,2,3,4,6,12
std::vector<int> factor(int n) {
    std::set<int> ans;
    for (int i = 1; i <= n/i; i++) {
        if (n % i == 0) {
            ans.insert(i);
            ans.insert(n/i);
        }
    }
    return std::vector<int>(ans.begin(), ans.end());
}

版本3:质因子分解,返回质因子及其出现次数,时间复杂度O(sqrt(n))。

// 例如:60 = 2^2 * 3^1 * 5^1,对应[{2,2}, {3,1}, {5,1}]
std::vector<std::pair<int,int>> factor(int n) {
    std::vector<std::pair<int,int>> ans;
    for (int i = 2; i <= n/i; i++) {
        if (n % i == 0) {
            int p = i, q = 0;
            while (n % i == 0) {
                n /= i;
                q += 1;
            }
            ans.push_back({p, q});
        }
    }
    if (n > 1) ans.push_back({n, 1});
    return ans;
}

版本4:对n!做质因子分解,时间复杂度:初始化O(n),单次查询O(logn*logn)。

// 使用方法:
//   1. 先调init(n)筛选出n以内的质数;
//   2. 调factor(n)返回n!的因子分解结果;比如factor(5)=[(2,3)(3,1)(5,1)]
struct ProductFactor {
    std::vector<int> prime;
    void init(int maxn) {
        std::vector<int> p(maxn+1, 1);
        for (int i = 2; i <= maxn; i++) {
            if (p[i]) prime.push_back(i);
            for (auto j : prime) {
                if (i * j > maxn) break;
                p[i*j] = 0;
                if (i % j == 0) break;
            }
        }
    }
    std::vector<pair<int,int>> factor(int n) {
        std::vector<pair<int,int>> ans;
        for (auto p : prime) {
            if (p > n) break;
            int cnt = 0;
            for (int nn = n; nn; nn /= p) {
                cnt += nn / p;
            }
            ans.push_back({p, cnt});
        }
        return ans;
    }
};

标签:std,vector,int,factor,因子,分解,ans,模板
From: https://www.cnblogs.com/chenfy27/p/18469655

相关文章

  • 模板-自动取模整型mint
    输入为int64类型,底层用int64表示,每次运算后自动取模。template<intMOD>structMInt{i64x;intnorm(i64u)const{u%=MOD;if(u<0)u+=MOD;returnu;}MInt(i64v=0):x(norm(v)){}intval()const{returnx;}MIntoperator-()const{returnMInt......
  • 模板-并查集DSU
    版本1:路径压缩。structDSU{ std::vector<int>fa; voidinit(intn){ fa.resize(n+1); std::iota(fa.begin(),fa.end(),0); } intleader(intx){ while(x!=fa[x]){ fa[x]=leader(fa[x]); } returnfa[x]; } voidjoin(intx,inty){ x......
  • 网站修改怎么进入后台?织梦网站模板修改地图?
    1.备份现有模板备份目的:防止修改过程中出现错误导致数据丢失。操作方法:复制模板文件夹到另一个位置。2.修改HTML结构修改内容:根据需求调整页面布局或元素。示例:添加导航栏、侧边栏等。3.修改CSS样式修改内容:调整页面的颜色、字体、布局等样式。示例:为导航栏添......
  • 网站后台的用户名修改?dw怎样修改网站模板?
    修改网站后台的用户名登录后台管理系统:打开浏览器,输入后台管理系统的地址。使用当前的用户名和密码登录。进入用户管理页面:导航到“用户管理”或“账户设置”等相关选项。选择要修改的用户:在用户列表中找到需要修改的用户名。编辑用户信息:点击“编辑”或......
  • 网站从后台怎么修改内容?怎么修改网站模板的内容?
    要从后台修改网站内容或模板,通常需要访问网站的管理界面或使用特定的开发工具。以下是两种常见方法的步骤:修改网站内容登录后台管理系统:通过浏览器访问网站的后台管理地址。输入管理员账号和密码进行登录。导航到内容管理:在后台管理界面中找到“内容管理”、“文章管......
  • 如何修改公司网站导航?帝国网站模板怎么修改?
    要修改公司网站的导航,特别是使用帝国网站模板的情况下,可以按照以下步骤进行:登录后台管理:打开浏览器,输入你的网站后台管理地址。输入用户名和密码登录。进入导航管理:登录后,找到“导航管理”或类似名称的选项。这通常位于“系统设置”、“模板管理”或“网站配置”下。......
  • 公司网站网页修改?网站模板主页修改?
    网站网页修改确定修改需求:明确需要修改的内容,如文本、图片等。备份现有文件:在修改前备份当前网页文件,以防万一。编辑HTML/CSS:打开需要修改的HTML文件。根据需求修改文本、图片路径等。测试修改效果:在本地或测试服务器上预览修改后的网页,确保一切正常。上线发布:将修改后......
  • 修改网站模板?公司网站修改文字?
    要修改公司网站的模板或文字,你可以按照以下步骤操作:访问网站后台:登录到你的网站管理后台,通常是在域名后面加上 /admin 或 /wp-admin 等路径。选择页面编辑:在后台管理界面找到需要修改的文字或模板所在的页面。编辑页面内容:如果是修改文字,直接在页面编辑器中......
  • 帝国cms网站模板修改详细教程?
    1.环境准备备份数据:在进行任何修改前,确保对现有网站的数据和文件进行完整备份。环境熟悉:了解帝国CMS的基本结构,包括模板文件的位置和命名规则。2.模板文件定位模板目录:通常模板文件位于./e/template/目录下,不同的主题可能有不同的子目录。模板文件类型:主要包括HTML模板......
  • 后台怎么修改网站文字?网站有了模板怎么修改?
    要修改网站的文字内容,通常有几种方法,具体取决于你的网站是如何构建和管理的。以下是一些常见的方法:使用内容管理系统(CMS):如果你的网站是基于WordPress、Joomla或Drupal等CMS构建的,你可以通过登录到后台管理系统来修改文字。进入“页面”或“文章”管理区域,找到需要编辑的内容......