题目大意:
你有两个朋友 你将对每一个朋友展示几个正整数
向第一个朋友展示 cnt1 个 向第二个朋友展示 cnt2 个
每个人的展示数唯一不重复
然而,第一个朋友不喜欢能被素数x整除的数字
第二个朋友不喜欢能被素数y整除的数字
你自然不会给你的朋友展示不喜欢的东西
你的任务是找到这样的最小数量v,你可以使用一组1,2,…,v中的数字来形成礼物
当然,您可以选择不提供一些数字。
如果大于1的正整数除了1和它本身之外没有正除数,则称为素数。
输入:
唯一的行包含四个正整数cnt1,cnt2,x,y(1≤cnt1,cnt2 <10^9; cnt1 +cnt2≤10^9;2≤x ,y≤3*10^4) - 语句中描述的数字。
数字x,y保证是素数。
输出:
唯一正整数v
想法:
本来就想做两个1000*1000*1000的数组的。。但是想了想这里可能用指针比较合适(或许这个题目也很适合用栈结构),主要考虑的是动态生成数据链。
#include<iostream>
using namespace std;
void San(long long cnt1, long long cnt2, int x, int y);
struct p{
long long num;
struct p *next;
};
int main()
{
long long cnt1, cnt2;
int x, y;
while (true)
{
cin >> cnt1 >> cnt2 >> x >> y;
San(cnt1, cnt2, x, y);
}
return 0;
}
void San(long long cnt1, long long cnt2, int x, int y)
{
p *p1;
p *p2;
p1 = new p;
p1->num = 0;
p1->next = NULL;
p2 = new p;
p2->num = 0;
p2->next = NULL;
if (y<x)
{
int z = x;
x = y;
y = z;
}
long long i = 1;
int xflag = 0;
int yflag = 0;
p *p11 = p1;
p *p22 = p2;
while (xflag != cnt1||yflag != cnt2)
{
if (i%x != 0 && xflag<cnt1)
{
p11->num = i;
p11->next = new p;
p11 = p11->next;
p11->num = 0;
p11->next = NULL;
xflag++;
}
else if (i%y == 0 && yflag<cnt2)
{
if (i%x == 0 || (p1->num == 0))
;
else if (p1->num%y == 0)
{
p *temp = p1;
p1 = p1->next;
delete temp;
}
else
{
p22->num = p1->num;
p22->next = new p;
p22->num = 0;
p22 = p22->next;
p1->num = i;
yflag++;
}
}
else if (i%y != 0 && yflag<cnt2)
{
p22->num = i;
p22->next = new p;
p22 = p22->next;
p22->num = 0;
p22->next = NULL;
yflag++;
}
i++;
}
cout << i-1 << endl;
while (p1->next != NULL)
{
p *temp = p1;
p1 = p1->next;
delete temp;
}
while (p2->next != NULL)
{
p *temp = p2;
p2 = p2->next;
delete temp;
}
}