2017西安交大ACM小学期数论 [阅兵式]
生活随笔
收集整理的這篇文章主要介紹了
2017西安交大ACM小学期数论 [阅兵式]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
閱兵式
發布時間: 2017年6月25日 12:53?? 最后更新: 2017年7月3日 09:27?? 時間限制: 1000ms?? 內存限制: 128M
描述閱兵式上,將士們排成一個整齊的方陣,每個將士面朝前方。問正中心的將士能向前看到幾個將士?注意,一條直線上的將士會產生遮擋關系。
多組輸入數據(不超過10000組)。
每組數據一行一個正整數n,表示方陣的大小。
數據滿足n≤106,n為奇數。
每組數據輸出一行一個正整數,表示答案。
樣例輸入1 5 樣例輸出1 7題解:由于這個具有很強的對稱性,所以我們只看一個三角形區域就可以了,把三角形區域的結果乘以4然后減去1就得到了總的答案。
三角形區域部分斜率的 種數計算方法如下:
橫坐標為1時候,縱坐標為1:1種
橫坐標為2時候,縱坐標為1:1種
橫坐標為3時候,縱坐標為1、2:2種
橫坐標為4時候,縱坐標為1、3:2種
我們可以知道橫坐標為x的時候,共有phi(x)種。其中phi是歐拉函數
這樣的話,只需要對歐拉函數求一個前綴和,就可以統計出三角形區域的斜率種數了!
代碼:
#include <stdio.h> #define MAXN 1000007 int minFactor[MAXN], phi[MAXN]; int prime[MAXN], primeNum; long long sum[MAXN]; void calPhi() {phi[1] = 1;for (int i = 2; i < MAXN; i++){if (!minFactor[i]){prime[primeNum++] = i;minFactor[i] = primeNum;phi[i] = i - 1;}for (int j = 1;; j++){int t = i * prime[j - 1];if (t >= MAXN)break;minFactor[t] = j;if (j == minFactor[i]){phi[t] = phi[i] * prime[j - 1];break;}phi[t] = phi[i] * (prime[j - 1] - 1);}} } int main(){calPhi();int n;sum[1] = 1;for(int i = 2;i < MAXN;i++){sum[i] = sum[i-1] + phi[i];}while(~scanf("%d",&n)){if(n == 1){puts("0");continue;}int t = n/2;long long res = sum[t];//求 一個三角形 printf("%lld\n",4*res-1);}return 0; }
總結
以上是生活随笔為你收集整理的2017西安交大ACM小学期数论 [阅兵式]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017西安交大ACM小学期数据结构 [
- 下一篇: 思科和juniper都被嫌弃?那咱就把旧