Codeforces 448E Divisors

数学型的题目吧,一开始太过于想去构造,发现不行,现在一直忙着补题,终于补到了这道,特意去看了后面很大的案例,发现了后面全是1,想想应该是数学思维型题目,对于1肯定要特殊处理,而且 在K超过 100000的情况下肯定全为1,因为每一次 k从0开始 k若比原来大1的话,肯定答案中会比原来多一个1,所以10^5那肯定就有10^5个1 了,若k为0肯定就是n本身了,剩下的部分 对于一开始就把n给分解,当然不需要素数分解,我没事吃饱了撑的想多了,直接分解即可,仔细观察那个f(x[i
-1])慢慢的多谢几个,写个七八个就会发现 得到的答案里的 每一部分 肯定是n的因子,只是顺序有一定的问题,一开始分解的时候把所有因子排个序,然后因为f(x) 这个函数会一步一步的去再次分解n的因子而得到下一个答案,所以可以若大的因子能整除小的 就加进去,最后就是输出 处理的问题了,

可惜啊 智商不够,处理了半天处理不了,他们所谓的“dfs树”问题,最后实在没办法 参考了 以为巨巨朋友做出来了,即便参考了还是写了很久,好题目吧,收藏一下,以后脑子秀逗了回来看看做做

题目: http://codeforces.com/contest/448/problem/E

#include<iostream>
#include<cstdio>
#include<list>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<cmath>
#include<memory.h>
#include<set>

#define ll long long

#define eps 1e-8

const int inf = 0xfffffff;

const ll INF = 1ll<<61;

using namespace std;

//vector<pair<int,int> > G;
//typedef pair<int,int > P;
//vector<pair<int,int> > ::iterator iter;
//
//map<ll,int >mp;
//map<ll,int >::iterator p;

ll fac[1000000 + 5];

ll n,k;

ll tot = 0ll;

vector<ll> G[1000000 + 5];

void init() {
	for(ll i=1;i * i <= n;i++) {
		if(n%i == 0) {
			fac[tot++] = i;
			if(i * i != n)
				fac[tot++] = n / i;
		}
	}
	sort(fac,fac + tot);
}

int mark = 0;

void dfs(ll pos,ll now) {
	if(mark >= 100000)return;
	if(pos == 0ll) {
		printf("1 ");
		mark++;return;
	}
	if(now == 0ll) {
		printf("%I64d ",fac[pos]);
		mark++;return ;
	}
	for(ll i=0ll;i<G[pos].size();i++) {
		dfs(G[pos][i],now - 1);
		if(mark >= 100000 )return ;
	}
}

int main() {
	while(scanf("%I64d %I64d",&n,&k) == 2) {
		init();
		if(k == 0) {
			printf("%I64d\n",n);
			continue;
		}
		if(k >= 100000) {
			if(n == 1)puts("1");
			else {
				for(int i=1;i<=100000;i++)
					printf("%d%c",1,i == 100000?'\n':' ');
			}
			continue;
		}
		int cnt = 0;

		for(ll i=0ll;i<tot;i++) {
			for(ll j=0ll;j<=i;j++)
				if(fac[i]%fac[j] == 0) {
					G[i].push_back(j);
					++cnt;
				}
		}
		dfs(tot - 1,k);
		puts("");
	}
	return 0;
}

Codeforces 448E Divisors,布布扣,bubuko.com

时间: 2024-10-16 20:43:34

Codeforces 448E Divisors的相关文章

Codeforces Round #256 (Div. 2) E Divisors

E. Divisors Bizon the Champion isn't just friendly, he also is a rigorous coder. Let's define function f(a), where a is a sequence of integers. Function f(a) returns the following sequence: first all divisors of a1 go in the increasing order, then al

codeforces 703E Mishka and Divisors

codeforces 703E Mishka and Divisors 题面 给出大小为\(1000\)的数组和一个数\(k\),求长度最短的一个子序列使得子序列的元素之积是\(k\)的倍数,如果有多个解输出元素和最小的序列. \(k\)和数组元素的数量级都是\(1e12\). 题解 \(f[i][d]\)表示前\(i\)项是\(d\)的倍数的最优解.因为\(d\)只可能是\(k\)的因数,所以离散化一下\(k\)的因数即可. 过程中需要多次求\(gcd\),直接求会超时.需要先预处理\(b[i

Codeforces Round #117 (Div. 2)---D. Common Divisors

Vasya has recently learned at school what a number's divisor is and decided to determine a string's divisor. Here is what he came up with. String a is the divisor of string b if and only if there exists a positive integer x such that if we write out

codeforces 893B Beautiful Divisors 打表

893B Beautiful Divisors 思路: 打表 代码: #include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i=(a); i<(b); ++i) #define _rep(i,a,b) for(int i=(a); i<=(b); ++i) int a[8]={1,6,28,120,496,2016,8128,32640}; int main() { int n; scan

CodeForces - 893B Beautiful Divisors

题目链接 CodeForces - 893B time limit per test:2 seconds memory limit per test:256 megabytes input:standard input output:standard output Recently Luba learned about a special kind of numbers that she calls beautiful numbers. The number is called beautifu

CodeForces 342A Xenia and Divisors (水题)

题意:给定 n 个数(小于等于7),让你把它分成 m 组,每组有三个数,且满足,a < b < c,并且 a 能整除 b,b 能整除 c. 析:对于这个题,因为题目说了是不大于7的,那么一想不就三组数么,124,136,126.就这三组,然后确定每一组的数量,首先只有第二组有3,那么第二组的数量就确定了, 然后再看剩下的两组,只有第一组有4,那么第一组也就确定,然后剩下的就是第三组,当然第三组只有6. 代码如下: #include <bits/stdc++.h> using nam

codeforces 27E . Number With The Given Amount Of Divisors 搜索+数论

题目链接 首先要知道一个性质, 一个数x的因子个数等于 a1^p1 * a2^p2*....an^pn, ai是x质因子, p是质因子的个数. 然后就可以搜了 #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #incl

CodeForces 112D Petya and Divisors 模拟题(水

题目链接:点击打开链接 论科学暴力的姿势重要性.. #include <cstdio> #include <iostream> #include <string.h> #include <math.h> #include <map> #include <algorithm> #include <set> #include <queue> using namespace std; #define ll int #

【Codeforces 342A】Xenia and Divisors

[链接] 我是链接,点我呀:) [题意] [题解] 最后a,b,c只有以下3种情况 1,2,4 1,2,6 1,3,6 那么用cnt[8]统计每个数字出现的次数. 输出cnt[4]次1,2,4 (如果1或2不够,那么无解 紧接着 如果6的个数和1的个数不同,那么无解 如果2的次数+3的次数和6出现的次数不同,那么无解. 否则 输出cnt[2]个1,2,6 cnt[3]个1,3,6就ok了. 看看有没有输出够n/3组 不够的话就无解(说明有其他无用的数字出现 [代码] #include <bits