暴力求解
http://oj.jxust.edu.cn/contest/Problem?id=1702&pid=1
题意:给你一个整数n(1 <= n <= 40000),问拆成3个素数之和有多少种拆法?
解法:暴力减枝。先筛选出来范围内所有素数,暴力循环第1、2个素数,第3个通过n-a-b特判递增和是否为素数。
//#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <algorithm> #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> #define ME(x , y) memset(x , y , sizeof(x)) #define SF(n) scanf("%d" , &n) #define rep(i , n) for(int i = 0 ; i < n ; i ++) #define INF 0x3f3f3f3f #define mod 9973 using namespace std; typedef long long ll ; int vis[40009] , a[10009]; int l ; bool is_prime(int x) { if(x == 1) return false; int m = floor(sqrt(x)+0.5); for(int i = 2 ; i <= m ; i++) { if(x % i == 0) return false; } return true ; } void init() { l = 0 ; for(int i = 1 ; i <= 40000 ; i++) { if(is_prime(i)) { a[l++] = i; vis[i] = 1; } } } int main() { init(); int t ; scanf("%d" , &t); while(t--) { int n , ans = 0; scanf("%d" , &n); int sum ; for(int i = 0 ; i < l ; i++) { if(a[i] >= n) break ; for(int j = i ; j < l ; j++) { sum = n - (a[i]+a[j]) ; if(sum < a[j]) break ; if(vis[sum] && sum >= a[j]) { ans++; } } } cout << ans << endl ; } return 0 ; }