连续因子
本来我想的就是把所有因子列出来然后找第一个连续最长的,但是坑还不少。
1.数据12 2*3*4比12大,只能取2*3.
2. 我本来想优化,跳过连续的一个串,但是这样就跳过了其中的子串,而子串是可能的解。
3. 想优化只看开方以前的因子,事实证明别瞎优化。
4. 想暴力列举所有因子,丫的超时。
5. 对于没有其他因子的素数要特判。
6. 匹配连续的一个终结条件是已经没其他因子了。
都是泪,我瞎暴力枚举一个不好吗。。。
代码:
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
int N;
int yz[150] = {0}, k = 0;
int len = 0, p;
cin >> N;
for(ll i = 2; i * i<= N; i++)
{
if(N % i == 0){
yz[k++] = i;
yz[k++] = N / i;
}
}
sort(yz, k + yz);
// for(int i = 0; i < k; i++)
// cout << yz[i] << ' ';
// cout << endl;
for(int i = 0; i < k; i++)
{
bool flag = false;
ll ji = yz[i];
for(int j = i + 1; j < k; j++){
ji *= yz[j];
if(ji > N || N % ji)
flag = true;
if(yz[j] != yz[j - 1] + 1)
flag = true;
if(j == k - 1 && !flag){
flag = true;
j++;
}
if(flag){
if((j-i) > len){
p = i;
len = j - i;
}
break;
}
}
}
if(!len){
cout << 1 << endl;
cout << ((yz[0] != 0)?yz[0]:N) << endl;
return 0;
}
cout << len << endl;
for(int i = p; i < p + len; i++){
if(i > p)
cout << '*';
cout << yz[i];
}
return 0;
}
N个数求和
这题一开始爆空间了。
我就直接想求和来着,但是对于数据:
5
2147483647/2147483645 2147483644/2146666666 214444/2147483647 21444433/2147483643 2122222221/21474854
2147483647/2147483645 2147483644/2146666666 214444/2147483647 21444433/2147483643 2122222221/21474854
必须读一个处理一个。
而且是a*b/c而不是a/c*b,神他妈的右结合,害我老不过。
另外还有结果为0什么的。
#include <cstdio>
#include <cmath>
struct fen{
long long a;
long long b;
};
fen date[105];
long long gdb(long long a, long long b)
{
while(b)
{
long long mod = a % b;
a = b;
b = mod;
}
return a;
}
int main()
{
int n;
long long fenmu = 1, fenzi = 0;
scanf("%d", &n);
scanf("%lld/%lld", &date[0].a, &date[0].b);
fenmu = date[0].b;
fenzi = date[0].a;
for(int i = 1; i < n; i++){
scanf("%lld/%lld", &date[i].a, &date[i].b);
long long z = gdb(date[i].b, fenmu);
long long bei = date[i].b * fenmu / z;
//printf("%lld %lld %lld\n", bei, fenzi, fenmu);
long long bei1 = bei/date[i].b;
long long bei2 = bei/fenmu;
fenzi = fenzi * bei2 + bei1 * date[i].a;
fenmu = bei;
bei = gdb(fenzi, fenmu);
fenmu /= bei;
fenzi /= bei;
}
if(fenzi == 0){
printf("0");
return 0;
}
long long m = fenzi < 0?-fenzi:fenzi;
long long temp = gdb(m, fenmu);
fenzi = fenzi / temp;
fenmu = fenmu / temp;
long long zheng = fenzi / fenmu;
fenzi %= fenmu;
if(fenzi == 0){
printf("%lld", zheng);
}else if(zheng != 0){
printf("%lld %lld/%lld", zheng, fenzi, fenmu);
}else{
printf("%lld/%lld", fenzi, fenmu);
}
return 0;
}
/*
5
2147483647/2147483645 2147483644/2146666666 214444/2147483647 21444433/2147483643 2122222221/21474854
*/