让大家都AK的信心赛......
话说这种考试有什么意思(不),还不如做我出的那套模拟题呢......

T1:

20180329小测
其实这题是我三道题里AC得最晚的......
首先我们能用bitset+大力背包骗到58-64分......
考虑我们如果先枚举两个数能组合出的值,再计算另外一个数的方案数,什么情况下会算重?
显然是当这个值取模最后的那个数相同的时候,这样一个方案数会被计算多次!
此外还有一个十分显然的结论:当两个值取模最后那个数相同时,较大的那个值的答案会被包含在较小的那个值的答里面。
这样的话,我们在取模abc中某一个数的同余系下跑一个最短路,用另外两个数做边进行转移,最后再统计一发答案不就好了。
60分bitset代码:

 1 #pragma GCC optimize(3)
 2 #include<cstdio>
 3 #include<bitset>
 4 const int maxn=1e8+1e2;
 5 std::bitset<maxn> vis;
 6 
 7 long long h;
 8 int a,b,c,ans;
 9 
10 
11 int main() {
12     scanf("%lld%d%d%d",&h,&a,&b,&c);
13     if( a == 1 || b == 1 || c == 1 ) return printf("%lld\n",h),0;
14     for(int i=0;a*i<h;i++) {
15         if( vis[a*i] ) break;
16         for(int j=0;a*i+b*j<h;j++) {
17             if( vis[a*i+b*j] ) break;
18             for(int k=0;a*i+b*j+k*c<h;k++) {
19                 if( vis[a*i+b*j+k*c] ) break;
20                 vis[a*i+b*j+k*c] = 1;
21             }
22         }
23     }
24     printf("%llu\n",vis.count());
25     return 0;
26 }
View Code

相关文章:

  • 2021-08-11
  • 2022-01-23
  • 2021-06-07
  • 2021-12-20
  • 2021-10-29
  • 2021-12-30
  • 2021-12-30
猜你喜欢
  • 2022-12-23
  • 2021-12-28
  • 2021-08-10
  • 2021-11-10
  • 2022-02-07
  • 2021-05-28
  • 2021-06-13
相关资源
相似解决方案