http://acm.hdu.edu.cn/search.php?field=problem&key=2018+Multi-University+Training+Contest+1&source=1&searchmode=source
n=x+y+z,x|n,y|n,z|n;
n=t1*x,n=t2*y,n=t3*z;
1/t1+1/t2+1/t3=1;
假设t1>=t2>=t3;
解的:有三组解 1、2,4,4; 2、3,3,3;3、 2,3,6;
因为要求x*y*z的最大值,所以第三组解明显比第二组解小,所以第三个答案舍弃
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1e6+7;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
long long m;
if(n%3==0)
{
m=(long long)n/3*(long long)n/3*(long long)n/3;
printf("%lld\n",m);
}
else if(n%4==0)
{
m=(long long)n/2*(long long)n/4*(long long)n/4;
printf("%lld\n",m);
}
else
{
printf("-1\n");
}
}
}
给你n个括号的字符串,这n个字符串连接以后最多有多少个匹配的半括号,匹配的括号可以不连续
例如:)()(()( 结果为4
可以先将每个字符串中的已经匹配好的括号挑出来,所有的字符串都变成"))))",")))(((","(((",这三种形式
两个字符串排序a,b; (a排在b前面)x=min(a.l,b.r),(b排在a前面)y=min(a.r,b.l);可以匹配的括号数量,如果x>y
则a放在前面,若x Triangle Partition 总共有3n个点,输出n行(a,b,c);a,b,c为可以构成三角形的点的编号,这n个三角形不相交(输出一种结果即可) 按照x轴排个序,如果x轴相同,按y轴排个序,按顺序输出即可 先打表:a[1]=1,a[2]=1,a[n]=a[n-a[n-1]]+a[n-1-a[n-2]]; 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 每个数字出现的次数 2 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 1 2 1 3 1 2 1 4 1 2 1 3 1 2 除去第一项,可以发现数字出现次数的规律为 前2^i项数字出现的次数和等于前2^(i-1)项数字出现的次数和*2+1; 还可以发现 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37………… 2 6 10 14 18 22 26 30 34 ………… 4 12 20………… ………… 为首项2^i,公差为2^(i+1)次方的等差数列 计算出数组a a[i]表示前2^i次方项数字出现次数的和 a[i]=2*a[i-1]+1; 求前n项的an的和,先求出第n项在数字出现次数数列里的位置 因为是从规律是从第二项开始n--; 计算出完整前n项在数字出现次数的值sum,剩余的项数的数量为tmp,对应的值为sum+1 求出完整的对应的结果,最后结果加上第一项,求等差数列的和时除以2用逆元,否则会爆掉 给你UTF+8的时间,求UTFx.y(x)的时间(-14<=x,x.y<=14,0<=y<=9) #include
#include
Chiaki Sequence Revisited
16 16 17 18 18 19 20 20 20 21 22 22 23 24 24 24 24 25 26 26 27 28 28 28 29 30 30 31 32 32
32 32 32 32 33 34 34 35 36 36 36 37 38 38 39 40 40 40 40 41 42 42 43 44 44 44 45 46 46 47
48 48 48 48 48 49 50 50 51 52 52 52 53 54 54 55 56 56 56 56 57 58 58 59 60 60 60 61 62 62
63 64 64 64 64 64 64 64 65 66 66 67 68 68 68 69 70 70 71 72 72 72 72 73 74 74 75
1 6 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 1 2 1 3 1 2 1 4 1 2 1 3
1 2 1 7 1 2 1 3 1 2 1 4 1 2 1 for(int i=62; i>=0; i--)
{
if(tmp>=a[i])
{
tmp-=a[i];
sum+=f[i];
}
}
int getnum(ll x)///出现的次数
{
return lower_bound(f,f+63,x)-f+1;
}
ll solve(ll x)
{
ll ans=0;
for(ll i=1; i<=x; i=2*i)
{
ll num=(x-i)/(2*i);///公差
ll an=i+num*(2*i);///末项
num=(num+1)%mod;///项数
ll res=(((i+an)%mod*num)%mod*inv)%mod;///等差数列和
ans=(ans+res*getnum(i)%mod)%mod;
}
return (ans+1)%mod;
}
#include
Time Zone
#include