1. 程式人生 > >0 or 1 (數論 + 唯一分解定理)

0 or 1 (數論 + 唯一分解定理)

題意

T(n)是某個數的因子和的奇偶性,現在問S(n)的奇偶。

思路

對於某一個數k

分解了之後,就變成k=an1bn2...xnx

那麼它的因子和就是T(k)=(a0+a1+...+an1)(b0+b1+...+bn2)...(x0+x1+...+xnx)

因為素數除了2以外全是奇數。
顯然如果要使它的因子和為奇數,那麼它的素因子的指數必須為偶數。

(奇數 * 偶數 + 1 = 奇數)

這樣也就是它是一個數的平方。k=n2

上面是不含2的情況。

如果有2的話,2的指數多少都行。但是不管多少最終都可以並起來,變成k=n2或者k=2n2

程式碼

#include <stack>
#include <cstdio> #include <list> #include <set> #include <iostream> #include <string> #include <vector> #include <queue> #include <functional> #include <cstring> #include <algorithm> #include <cctype> #include <string> #include <map>
#include <cmath> using namespace std; #define LL long long #define ULL unsigned long long #define SZ(x) (int)x.size() #define Lowbit(x) ((x) & (-x)) #define MP(a, b) make_pair(a, b) #define MS(arr, num) memset(arr, num, sizeof(arr)) #define PB push_back #define X first #define Y second #define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1)) #define LC rt << 1, l, mid #define RC rt << 1|1, mid + 1, r #define LRT rt << 1 #define RRT rt << 1|1 const double PI = acos(-1.0); const int INF = 0x3f3f3f3f; const double eps = 1e-8; const int MAXN = 5000 + 10; const int MOD = 1e9 + 7; const int dir[][2] = { {-1, 0}, {0, -1}, { 1, 0 }, { 0, 1 } }; int cases = 0; typedef pair<int, int> pii; int main() { int T; scanf("%d", &T); while (T--) { int cnt = 0; int n; scanf("%d", &n); for (LL i = 1; i*i <= n; i++) { cnt++; if (2*i*i <= n) cnt++; } printf("%d\n", cnt & 1); } return 0; }