[2017浙工大之江学院决赛 L] qwb与整数对(离线,筛)

Posted tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[2017浙工大之江学院决赛 L] qwb与整数对(离线,筛)相关的知识,希望对你有一定的参考价值。

题目链接:http://115.231.222.240:8081/JudgeOnline/problem.php?cid=1005&pid=11

这题不会,看了柠檬巨的题解才知道可以筛出来。

枚举a、b,然后求下m最小能是多少,可以满足原式为整数。可以用(a*b)-(a*a+b*b)%(a*b)求。然后在m的基础上算上a*b的倍数再更新到对应case上即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn = 6666;
 5 const int maxm = 44444;
 6 const int Q =  20000;
 7 int n[maxn], m[maxn], ret[maxn];
 8 vector<int> id[maxm];
 9 
10 int main() {
11     // freopen("in", "r", stdin);
12     for(int i = 1; ~scanf("%d%d",&n[i],&m[i]) && (n[i]||m[i]); i++) {
13         id[m[i]+Q].push_back(i);
14     }
15     for(int a = 1; a <= 1000; a++) {
16         for(int b = a+1; b <= 1000; b++) {
17       int M = (a*b)-(a*a+b*b)%(a*b);
18             for(int t = 0; M+t*(a*b) <= Q; t++) {
19                 for(int i = 0; i < id[M+t*(a*b)+Q].size(); i++) {
20                     if(b < n[id[M+t*(a*b)+Q][i]]) ret[id[M+t*(a*b)+Q][i]]++;
21                 }
22             }
23             for(int t = 1; M-t*(a*b) >= -Q; t++) {
24                 for(int i = 0; i < id[M-t*(a*b)+Q].size(); i++) {
25                     if(b < n[id[M-t*(a*b)+Q][i]]) ret[id[M-t*(a*b)+Q][i]]++;
26                 }
27             }
28         }
29     }
30     for(int i = 1; n[i]||m[i]; i++) {
31         printf("Case %d: %d\n", i, ret[i]);
32     }
33     return 0;
34 }

 

以上是关于[2017浙工大之江学院决赛 L] qwb与整数对(离线,筛)的主要内容,如果未能解决你的问题,请参考以下文章

[2017浙工大之江学院决赛 M] qwb与二叉树(记忆化搜索,卡特兰数)

2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)

[2017年第0届浙江工业大学之江学院程序设计竞赛决赛 I] qwb VS 去污棒(并查集,按秩合并,最小生成树,LCA)

2017年浙工大迎新赛热身赛 J Forever97与寄信 数论/素数/Codeforces Round #382 (Div. 2) D. Taxes

2017年浙工大迎新赛热身赛 Lcayun日常之赏月易错特判

2015浙工大校赛-Problem C: 三角—— 费马大定理+勾股数