当前位置: 首页 > news >正文

UVA - 1635 Irrelevant Elements(质因数分解)

传送门


因为组合数的计算公式是递推过来的,那么首先对 m m m质因数分解,接着我们对组合数的计算中间变量每次质因数分解,即分子 n − i + 1 n-i+1 ni+1分解的质因数都加一, i i i分解的质因数都减一,然后遍历 m m m的所有质因数,当且仅当组合数的所有质因数个数均大于等于 m m m的个数才可以作为答案

注意几个细节:一是 n n n一开始要先减一最后的答案都加一;二是分解质因数的过程中最后一步要特判是否分解到 1 1 1,因为该数可能是大于其根号的一个质数

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <cstdio>
#include <string>
#include <bitset>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ins insert
#define lowbit(x) (x&(-x))
#define mkp(x,y) make_pair(x,y)
#define mem(a,x) memset(a,x,sizeof a);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> P;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int Mod=1e9+7;
const int maxn=2e5+10;

map<int,int> mp1,mp2;
vector<int> fac;
set<int> ans;

void add_fac(int x,int d){
    int y=sqrt(x+0.5);
    for(int i=2;i<=y;i++){
        if(x%i==0){
            while(x%i==0){
                x/=i;
                mp2[i]+=d;
            }
        }
        if(x==1) break;
    }
    if(x>1) mp2[x]+=d;
}

bool check(){
    for(auto i: fac){
        if(mp2[i]<mp1[i]) return false;
    }
    return true;
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    //ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,m;
    while(cin>>n>>m){
        mp1.clear(),mp2.clear(),ans.clear(),fac.clear();
        int p=sqrt(m+0.5);
        for(int i=2;i<=p;i++){
            if(m%i==0){
                fac.push_back(i);
                while(m%i==0){
                    m/=i;
                    mp1[i]++;
                }
            }
            if(m==1) break;
        }
        if(m>1){  //这里最容易忘记
            fac.push_back(m);
            mp1[m]++;
        }
        n--;
        //for(auto i: fac) cout<<i<<endl;
        for(int i=1;i<=(n>>1);i++){
            add_fac(n-i+1,1);
            add_fac(i,-1);
            if(check()){
                ans.insert(i);
                ans.insert(n-i);
            }
        }
        cout<<ans.size()<<endl;
        bool ok=0;
        for(auto i: ans){
            if(!ok){
                ok=1;
                cout<<i+1;
            }else cout<<" "<<i+1;
        }
        cout<<endl;
    }
    return 0;
}

相关文章:

  • spfile和pifle的一点浅浅的认识
  • 欧拉函数
  • UVA - 1636 Headshot(条件概率)
  • Oracle RAC日常基本维护命令
  • UVA - 11181 Probability|Given(条件概率+状压dfs)
  • UVA - 1637 Double Patience(全概率+记忆化搜索)
  • Oracle检查对象[第八章笔记]
  • 魔法数字(dfs/bfs)
  • Win32 OpenGL编程(8) 3D模型变换及其组合应用
  • 牛妹的春游(二维费用背包+技巧)
  • 2019 ICPC 南京区域赛 - C Digital Path(多段图DP)
  • 去年我们在哪儿?——09年SD2.0大会侧记(2)
  • 2019 CSP-J 纪念品(完全背包+思维)
  • 从MTK的BIN文件里提取图片资源
  • 无题(Floyd的理解)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 30天自制操作系统-2
  • 4. 路由到控制器 - Laravel从零开始教程
  • CAP理论的例子讲解
  • httpie使用详解
  • Java的Interrupt与线程中断
  • Mybatis初体验
  • mysql innodb 索引使用指南
  • spark本地环境的搭建到运行第一个spark程序
  • text-decoration与color属性
  • VUE es6技巧写法(持续更新中~~~)
  • Vue2.0 实现互斥
  • Vue小说阅读器(仿追书神器)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 理解在java “”i=i++;”所发生的事情
  • 前端临床手札——文件上传
  • 区块链分支循环
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 三分钟教你同步 Visual Studio Code 设置
  • 线性表及其算法(java实现)
  • 详解NodeJs流之一
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一个项目push到多个远程Git仓库
  • 怎样选择前端框架
  • - 转 Ext2.0 form使用实例
  • 字符串匹配基础上
  • ​决定德拉瓦州地区版图的关键历史事件
  • $.ajax中的eval及dataType
  • (31)对象的克隆
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (实战篇)如何缓存数据
  • (算法)Travel Information Center
  • (一) springboot详细介绍
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .Net(C#)常用转换byte转uint32、byte转float等