题意
给一个数n,找出gcd(a,b) = a^b的个数 (1<=b<=a<=n)。
n的数据范围:1到30000000
思路
c满足gcd(a,b) = a^b,打表观察数据得出c = a - b;又因为c是a的约数,用类似素数筛选的方法降低时间复杂度。
总结
敲代码的时候忘记打表这个东西的存在,只要一次性将所有的结果算出存在数组里,每次提取就可以,不用每次都算一遍。
智障啊_(:з」∠)_为什么想不到,不然又可以A一道题
#include <iostream> #include <cstdio> #include <algorithm> #include <map> #include <cstring> #include <string> typedef long long LL; const LL maxn = 30000005; using namespace std; LL ans[maxn]; LL T, kase = 0, n; void solve() { for(int i = 1; i <= maxn; i++) for(int j = i+i; j <= maxn; j+=i) if((j^(j-i)) == i) ans[j]++; for(int i = 2; i <= maxn; i++) ans[i] += ans[i-1]; } int main() { //freopen("in.txt","r",stdin); solve(); cin >> T; while(T--) { cin >> n; cout << "Case " << ++kase << ": " << ans[n] << endl; } return 0; }
时间: 2024-10-11 01:42:22