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@0==0||(n%4==0&&n0!=0))tag=1; else tag=0; for(int i=n;;){ if(i@0==0||(i%4==0&&i0!=0))sum+=366; else sum+=365; i++; int tag1; if(i@0==0||(i%4==0&&i0!=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); }