您的位置:首页 > 其它

2015多校8

2015-08-16 09:38 375 查看
SolvedPro.IDTitleAuthorSource(AC/Submit)Ratio
5380Travel with candySXYZ2015 Multi-University Training Contest 8(46/103)44.66%
5381The sum of gcdSXYZ2015 Multi-University Training Contest 8(208/496)41.94%
5382GCD?LCM!SXYZ2015 Multi-University Training Contest 8(73/139)52.52%
5383Yu-Gi-Oh!SXYZ2015 Multi-University Training Contest 8(95/366)25.96%
5384DanganronpaSXYZ2015 Multi-University Training Contest 8(278/506)54.94%
5385The pathSXYZ2015 Multi-University Training Contest 8(202/546)37.00%
5386CoverSXYZ2015 Multi-University Training Contest 8(377/1092)34.52%
5387ClockSXYZ2015 Multi-University Training Contest 8(325/469)69.30%
5388Geometer's SketchpadSXYZ2015 Multi-University Training Contest 8(21/58)36.21%
5389Zero EscapeSXYZ2015 Multi-University Training Contest 8(485/953)50.89%
5390treeSXYZ2015 Multi-University Training Contest 8(28/160)17.50%
HDU 5381

给定一个数组,多次询问,求区间[l,r]内所有子区间的最大公约数之和。

以a[x]为右端点的gcd区间情况最多只有log(a[x])种,因为a[x]的因子只有sqrt(a[x])种,a[x]的因子的因子只有sqrt(sqrt(a[x]))种,....依次类推共有log(a[x])种

如下图x=7的情况

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int fen=12*3600;
int hh,mm,ss;
int a[4],b[4];
int run(int a,int b)
{
int ans=abs(a-b);
ans%=fen;
if(ans>fen/2)ans=fen-ans;
return ans;
}
int gcd(int a,int b)
{
if(a%b==0)return b;
return gcd(b,a%b);
}
void print(int x)
{
x*=360;
int g=gcd(x,fen);
int t1=x/g;
int t2=fen/g;
if(t2==1)printf("%d",t1);
else printf("%d/%d",t1,t2);
}
int main()
{
int T;
scanf("%d",&T);
char str[100];
while(T--)
{
scanf("%s",str);
sscanf(str,"%d:%d:%d",&hh,&mm,&ss);
if(hh>=12)hh-=12;
a[1]=hh*3600+60*mm+ss;
a[2]=12*(60*mm+ss);
a[3]=12*60*ss;
b[1]=run(a[1],a[2]);
b[2]=run(a[1],a[3]);
b[3]=run(a[2],a[3]);
for(int i=1;i<=3;i++)
{
print(b[i]);
printf(" ");
}
puts("");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: