RE 求调悬关
  • 板块学术版
  • 楼主cmaths
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/14 17:56
  • 上次更新2023/11/14 19:48:26
查看原帖
RE 求调悬关
300098
cmaths楼主2023/11/14 17:56
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int P = 2000;
int n, n3, p;

void init()
{
	scanf("%d %d %d", &n, &n3, &p);
}

namespace sub1
{
	struct Node
	{
		int a, b, c;
	};
	queue <Node> q;
	void solve()
	{
		int cnt = 0;
		for(int a = 1; a <= p; a++)
		{
			for(int b = 0; b <= p; b++)
			{
				for(int c = 1; c <= p; c++)
				{
					if((((ll)n * n + 1) % a + b) % c == n3)
					{
						cnt++;
						if(cnt <= 100000)
						{
							q.push({a, b, c});
						}
					}
				}
			}
		}
		printf("%d\n", cnt);
		while(q.size())
		{
			printf("%d %d %d\n", q.front().a, q.front().b, q.front().c);
			q.pop();
		}
	}
}

int d[P + 5];
int di[P + 5][105];
namespace sub2
{
	void solve()
	{
		d[0] = p;
		for(int i = 1; i <= P; i++)
		{
			for(int j = 1; j <= i; j++)
			{
				if(i % j == 0)
				{
					d[i]++;
					di[i][d[i]] = j;
				}
			}
		}
		for(int i = 1; i <= 100; i++)
		{
			printf("%d ", i);
			for(int j = 1; j <= d[i]; j++)
			{
				printf("%d ", di[i][j]);
			}
			printf("\n");
		}
		ll sum = 0;
		for(int a = 1; a <= p; a++)
		{
			for(int b = 0; b <= p; b++)
			{
				int n2 = (int)(((ll)n * n + 1) % a + b);
				if(n2 < n3)
				{
					continue;
				}
				if(n2 == n3)
				{
					sum += (ll)p - n3;
				}
				else
				{
					int j = n2 - n3;
					int x = upper_bound(di[j] + 1, di[j] + d[j] + 1, n3) - di[j];
					int y = upper_bound(di[j] + 1, di[j] + d[j] + 1, p) - di[j];
					printf("%d 111 %d\n", x, y);
					sum += (ll)y - x;
				}
			}
		}
		printf("%lld\n", sum);	
		
		
		printf("114514\n");
		int cnt = 0;
		for(int a = 1; a <= p; a++)
		{
			for(int b = 0; b <= p; b++)
			{
				int n2 = (int)(((ll)n * n + 1) % a + b);
				if(n2 < n3)
				{
					continue;
				}
				if(n2 == n3)
				{
					if(cnt <= 100000)
					{
						for(int i = n3 + 1; i <= p; i++)
						{
							cnt++;
							if(cnt <= 100000)
							printf("%d %d %d\n", a, b, i);
						}						
					}
				}
				else
				{
					int j = n2 - n3;
					int x = upper_bound(di[j] + 1, di[j] + d[j] + 1, n3) - di[j];
					int y = upper_bound(di[j] + 1, di[j] + d[j] + 1, p) - di[j];
					if(cnt <= 100000)
					{
						for(int i = x; i < y; i++)
						{
							printf("%d\n", i);
							cnt++;
							if(cnt <= 100000)
							printf("%d %d %d\n", a, b, di[j][i]);
						}					
					}
				}
			}
		}
	}
}

void solve()
{
	if(p <= 100)
	{
		sub1::solve();
	}
	else
	{
		sub2::solve();
	}
}

int main()
{
//	freopen("enumerate.in", "r", stdin);
	freopen("enumerate111.out", "w", stdout);
	init();
	solve();
	return 0;
}

输入:

196 31 1857

运行到 100 行左右 RE 了

2023/11/14 17:56
加载中...