A
http://codeforces.com/contest/678/problem/A
题意:略。
做法:略。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, k;
scanf("%d %d", &n, &k);
int s=n/k;
int ans=s*k;
if(ans<=n)ans+=k;
printf("%d\n", ans);
}
B
http://codeforces.com/contest/678/problem/B
题意:给一个年份,找出该年份以后的最小年份,使之与该年份的日历完全相同。
做法:枚举年份,闰年366,否则365,相差的天数是7的倍数并且同为闰年或者同不闰即可。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int sum=0;
int tag;
if(n%400==0||(n%4==0&&n%100!=0))tag=1;
else tag=0;
for(int i=n;;){
if(i%400==0||(i%4==0&&i%100!=0))sum+=366;
else sum+=365;
i++;
int tag1;
if(i%400==0||(i%4==0&&i%100!=0))tag1=1;
else tag1=0;
if(sum%7==0&&tag==tag1){
printf("%d\n", i);
return 0;
}
}
}
C
http://codeforces.com/contest/678/problem/C
题意:给定n,a,b,p,q,要给1-n染色。其中每个a的倍数贡献p,b的倍数贡献q,既是a的倍数又是b的倍数可以选择p或q,问最大贡献和。
做法:算出a的倍数的个数A,b的倍数的个数B,总贡献为
A∗p+B∗q
这里把每个既是a的倍数又是b的倍数的数多加了一个min(p,q),所以要减去
min(p,q)∗n/lcm(a,b)
其中lcm为最小公倍数,可以通过a*b/__gcd(a,b)求出。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n, a, b, p, q;
scanf("%I64d%I64d%I64d%I64d%I64d", &n, &a, &b, &p, &q);
ll ans=0;
ans+=n/a*p;
ans+=n/b*q;
ll c=a*b/__gcd(a, b);
ans-=n/c*min(p, q);
printf("%I64d\n", ans);
}