1. 程式人生 > >51Nod-1082-與7無關的數

51Nod-1082-與7無關的數

ACM模版

描述

描述

題解

這道題如果暴力解題,超時是一定的,所以需要用到打表來解決。這裡需要注意的是資料溢位問題,開始時因為忽略了這個問題,i * i時發生了資料溢位,所以導致大資料測試資料係數WA,找了好久才找到問題所在,於是將i定義為long long後成功AC了。

程式碼

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int MAXN = 1e6 + 7;

bool A[MAXN];
long long sum[MAXN];

void
debug() { for (int i = 0; i < MAXN; i++) { printf("%4d %4d\n", i, A[i]); } return ; } void init() { memset(A, true, sizeof(A)); // 篩除7的倍數 for (int i = 7; i < MAXN; i += 7) { A[i] = false; } // 篩選數位含7 int radix; for (int i = 1; i < MAXN; i *= 10
) { radix = i * 10; for (int j = i * 7; j < MAXN; j += radix) { for (int k = 0; k < i; k++) { A[k + j] = false; } } } // 除錯 // debug(); return ; } void solve() { sum[0] = 0; sum[1] = 1; for
(long long i = 2; i < MAXN; i++) // 這裡的必須是long long { if (A[i]) { sum[i] = sum[i - 1] + i * i; // 因為這裡i * i,所以要考慮到溢位 } else { sum[i] = sum[i - 1]; } } return ; } int main(int argc, const char * argv[]) { init(); solve(); // freopen("input.txt", "r", stdin); int T, N; cin >> T; while (T--) { scanf("%d", &N); printf("%lld\n", sum[N]); } return 0; }