让大家都AK的信心赛......
话说这种考试有什么意思(不),还不如做我出的那套模拟题呢......
T1:
其实这题是我三道题里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 }