QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#387861#3231. Call It What You Wantzhouhuanyi100 ✓327ms18040kbC++142.3kb2024-04-12 22:07:022024-04-12 22:07:04

Judging History

This is the latest submission verdict.

  • [2024-04-12 22:07:04]
  • Judged
  • Verdict: 100
  • Time: 327ms
  • Memory: 18040kb
  • [2024-04-12 22:07:02]
  • Submitted

answer

#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#define N 100000
using namespace std;
int read()
{
	char c=0;
	int sum=0;
	while (c<'0'||c>'9') c=getchar();
	while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
	return sum;
}
int gcd(int x,int y)
{
	if (!y) return x;
	return gcd(y,x%y);
}
int T,n,length,phi[N+1],miu[N+1],delta[N+1];
vector<int>tong[N+1];
vector<int>v[N+1];
bool nprime[N+1];
bool cmp(vector<int>a,vector<int>b)
{
	if (a.size()!=b.size()) return a.size()<b.size();
	else return a<b;
}
vector<int>solve(int x)
{
	vector<int>p;
	for (int i=0;i<=phi[x];++i) delta[i]=0;
	delta[0]=1;
	for (int i=0;i<v[x].size();++i)
	{
		if (miu[v[x][i]]==1)
		{
			for (int j=phi[x];j>=x/v[x][i];--j) delta[j]-=delta[j-x/v[x][i]];
		}
		else
		{
			for (int j=x/v[x][i];j<=phi[x];++j) delta[j]+=delta[j-x/v[x][i]];
		}
	}
	for (int i=phi[x];i>=0;--i) p.push_back(delta[i]);
	return p;
}
void output(vector<int>p)
{
	printf("(");
	if (p.size()-1==1) printf("x");
	else printf("x^%d",p.size()-1);
	for (int i=p.size()-2;i>=0;--i)
	{
		if (p[i]==1)
		{
			if (i>1) printf("+x^%d",i);
			else if (i==1) printf("+x");
			else printf("+1");
		}
		else if (p[i]==-1)
		{
			if (i>1) printf("-x^%d",i);
			else if (i==1) printf("-x");
			else printf("-1");
		}
		else if (p[i]>0)
		{
			if (i>1) printf("+%dx^%d",p[i],i);
			else if (i==1) printf("+%dx",p[i]);
			else printf("+%d",p[i]);
		}
		else if (p[i]<0)
		{
			if (i>1) printf("%dx^%d",p[i],i);
			else if (i==1) printf("%dx",p[i]);
			else printf("%d",p[i]);
		}
	}
	printf(")");
	return;
}
int main()
{
	for (int i=1;i<=N;++i) miu[i]=1,phi[i]=i;
	for (int i=2;i<=N;++i)
		if (!nprime[i])
		{
			miu[i]=-1,phi[i]=i-1;
			for (int j=(i<<1);j<=N;j+=i)
			{
				if ((j/i)%i==0) miu[j]=0;
				miu[j]=-miu[j],phi[j]=phi[j]/i*(i-1),nprime[j]=1;
			}
		}
	for (int i=1;i<=N;++i)
		if (miu[i]!=0)
		{
			for (int j=i;j<=N;j+=i) v[j].push_back(i);
		}
	T=read();
	while (T--)
	{
		n=read(),length=0;
		for (int i=1;i<=n;++i)
			if (n%i==0)
				tong[++length]=solve(i),reverse(tong[length].begin(),tong[length].end());
		sort(tong+1,tong+length+1,cmp);
		for (int i=1;i<=length;++i) reverse(tong[i].begin(),tong[i].end()),output(tong[i]);
		puts("");
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 327ms
memory: 18040kb

input:

100
96
2510
99505
66667
99681
92378
56
68
66277
1785
99785
66259
98670
52
54
98
66289
2805
94
96135
99699
6545
97051
63
96577
40755
10465
66511
74
81
99671
97495
76
66559
100
67
58
86
88711
99905
88179
66421
71
99295
99385
97643
385
84
66427
99015
1365
96937
64
99645
95381
72
90321
99995
88
70
99849...

output:

(x-1)(x+1)(x^2-x+1)(x^2+1)(x^2+x+1)(x^4-x^2+1)(x^4+1)(x^8-x^4+1)(x^8+1)(x^16-x^8+1)(x^16+1)(x^32-x^16+1)
(x-1)(x+1)(x^4-x^3+x^2-x+1)(x^4+x^3+x^2+x+1)(x^250-x^249+x^248-x^247+x^246-x^245+x^244-x^243+x^242-x^241+x^240-x^239+x^238-x^237+x^236-x^235+x^234-x^233+x^232-x^231+x^230-x^229+x^228-x^227+x^226-...

result:

ok 100 lines