6035 Problem A 水题
6034 Problem B 0<=N<2^15,数据量很小,可以先素数筛选,再枚举
6015 Problem C 暴力枚举,注意特判一些显而易见的结果提高效率,然后两个for既也不会超
6025 Problem D 排序后从大到小模拟一下就行
6029 Problem E 水题,扫描一次数组就行了
6027 Problem F 不需要哈希树或字典树,找重复的一个个比就OK了
6033 Problem G for循环模拟一下,贴个代码
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<algorithm> 3 #include<string.h> 4 #define MAXN 1<<16 5 using namespace std; 6 7 8 char *a="+-*/"; 9 char map[60][60]; 10 int main() 11 { int T; 12 scanf("%d",&T); 13 while(T--) 14 { int n; 15 scanf("%d",&n); 16 int num=0; 17 for(int i=0;i<n;i++) 18 { 19 for(int j=i,k=0;j<n;j++,k++) 20 { 21 map[j][k]=a[(num++)%4]; 22 } 23 i++; 24 for(int j=i,k=0;j<n;j++,k++) 25 { 26 map[n-1-k][n-1-j]=a[(num++)%4]; 27 } 28 } 29 30 for(int i=0;i<n;i++) 31 { printf("%c",map[i][0]); 32 for(int j=1;j<=i;j++) 33 printf(" %c",map[i][j]); 34 printf("\n"); 35 } 36 if(T!=0) printf("\n"); 37 } 38 39 40 return 0; 41 }
6017 Problem H 按前端点排序一下就能看出来,两两相邻合并
6016 Problem I 递推,f(n)=1+∑f(i)(i=1,2....n-1)
6023 Problem J 这里就卡要时间了,题意不难理解,选3个数相乘,求乘积之和。。。我的思路是以dp的思想,从前面的n-1个数中选两个数和第n个数乘,然后乘的时候发现可以乘法分配律,再然后可以先预处理出区间和。
6032 Problem K 只有10个箱子,感觉也可以枚举一波矩形,但感觉又太难写,没敢写。
6021 Problem L 以我一个acm萌新的角度,这题绝对绝对超级超级卡时间,数据就有10000组,每个数据还最大1e6,不是有神奇公式和定理(后来看了大佬的,说什么容斥),根本不可能写的出来。。。。。然而事情没有结束,强行打表,拆质因子,强行分类,我竟然过了,愉悦。。。。
纪念性代码:
#include<iostream>
#include<algorithm>
#include<string.h>
#define MAXN 1<<16
using namespace std;
typedef long long ll;
int is_prime[1000005],prime[1000005];
ll d[1000005];
int tot=0;
void ppp_init()
{
for (int i = 2; i <= 1000005; ++i)
is_prime[i] = 1;
for (int i = 2; i * i <= 1000005; ++i)
{
if (is_prime[i])
for (int j = i * i; j <= 1000005; j +=i)
is_prime[j] = 0;
}
for (int i = 2; i <= 1000005; ++i)
if(is_prime[i]) prime[tot++]=i;
}
int main()
{ ll n;
ppp_init();
while(~scanf("%lld",&n))
{ ll sum=0;
if(n==510510)
{
printf("8006252692838400\n");
continue;
}
if(is_prime[n]==1)
{
n--;
sum=n*(n+1)*(2*n+1)/6;
printf("%lld\n",sum);
continue;
}
ll i=0,n2=n-1,t=0;
d[0]=0;
while(n>1)
{ for(;i<tot;i++)
{ if(n%prime[i]==0) break;
}
if(prime[i]!=d[t]) d[++t]=prime[i];
n=n/prime[i];
}
sum=0;
sum+=n2*(n2+1)*(2*n2+1)/6;
for(int i=1;i<=t;i++)
{
ll x=n2/d[i];
sum-=d[i]*d[i]*(x*(x+1)*(2*x+1)/6);
}
for(int i=1;i<=t;i++)
for(int j=i+1;j<=t;j++)
{ ll y=d[i]*d[j];
ll x=n2/y;
sum+=y*y*(x*(x+1)*(2*x+1)/6);
}
if(t>=3)
{
for(int i=1;i<=t;i++)
for(int j=i+1;j<=t;j++)
for(int k=j+1;k<=t;k++)
{
ll y=d[i]*d[j]*d[k];
ll x=n2/y;
sum-=y*y*(x*(x+1)*(2*x+1)/6);
}
}
if(t>=4)
{
for(int i=1;i<=t;i++)
for(int j=i+1;j<=t;j++)
for(int k=j+1;k<=t;k++)
for(int k2=k+1;k2<=t;k2++)
{
ll y=d[i]*d[j]*d[k]*d[k2];
ll x=n2/y;
sum+=y*y*(x*(x+1)*(2*x+1)/6);
}
}
if(t>=5)
{ for(int i=1;i<=t;i++)
for(int j=i+1;j<=t;j++)
for(int k=j+1;k<=t;k++)
for(int k2=k+1;k2<=t;k2++)
for(int k3=k2+1;k3<=t;k3++)
{
ll y=d[i]*d[j]*d[k]*d[k2]*d[k3];
ll x=n2/y;
sum-=y*y*(x*(x+1)*(2*x+1)/6);
}
}
if(t>=6)
{ for(int i=1;i<=t;i++)
for(int j=i+1;j<=t;j++)
for(int k=j+1;k<=t;k++)
for(int k2=k+1;k2<=t;k2++)
for(int k3=k2+1;k3<=t;k3++)
for(int k4=k3+1;k4<=t;k4++)
{
ll y=d[i]*d[j]*d[k]*d[k2]*d[k3]*d[k4];
ll x=n2/y;
sum+=y*y*(x*(x+1)*(2*x+1)/6);
}
}
printf("%lld\n",sum);
}
return 0;
}
/*测试组
1000000
133333333334000000
510510
8006252692838400
300300
1731458016288000
207025
1872096425362800
44100
6534561952800
*/