看程式寫結果(program)
time limit:1000ms memory limit:64mb
題目描述
lyk 最近在準備 noip2017 的初賽,它最不擅長的就是看程式寫結果了,因此它拼命地
在練習。
這次它拿到這樣的乙個程式:
pascal:
readln(n);
for i:=1 to n do read(a[i]);
for i:=1 to n do for j:=1 to n do for k:=1 to n do for l:=1 to n do
if (a[i]=a[j]) and (a[i]
writeln(ans);
c++:
scanf(「%d」,&n);
for (i=1; i<=n; i++) scanf(「%d」,&a[i]);
for (i=1; i<=n; i++) for (j=1; j<=n; j++) for (k=1; k<=n; k++) for (l=1; l<=n; l++)
if (a[i]==a[j] && a[i]
printf(「%d\n」,ans);
lyk 知道了所有輸入資料,它想知道這個程式執行下來會輸出多少。
輸入格式(program.in)
第一行乙個數 n,第二行 n 個數,表示 ai。
輸出格式(program.out)
乙個數表示答案。
輸入樣例
41 1 3 3
輸出樣例
4資料範圍
對於 20%的資料 n<=50。
對於 40%的資料 n<=200。
對於 60%的資料 n<=2000。
對於 100%的資料 n<=100000,1<=ai<=1000000000。
其中均勻分布著 50%的資料不同的 ai 個數<=10,對於另外 50%的資料不同的 ai 個
數》=n/10。
首先說:直接貼上**20%的資料肯定沒問題,連對拍的**都給你了,這個題還是比較良心的,20分,關鍵是如何優化
1 #include2 #include3 #include4 #include5#define n 100010
6using
namespace
std;
7const
int mo=1e9+7;8
long
long
sum[n],a[n],num[n],ans;
9int
n,x;
10int
main()
1123
for(int i=1;i<=x;i++)
24 num[i]=(num[i]*num[i])%mo;
25for(int i=1;i<=x;i++)
26 sum[i]=sum[i-1]+num[i];
27for(int i=1;i)
28 ans=(ans+num[i]*(sum[x]-sum[i]))%mo;
29 printf("%d"
,ans);
30return0;
31 }
思路:讀入之後,首先sort一遍,相同的數字肯定挨在了一起,掃一遍,記錄每種數字出現的次數(即它的個數)(接下來用len表示),每乙個len都平方一邊,並用sum記錄len^2的
字首和。對於第i種數字對於答案的貢獻為leni*len(i+1)+leni*len(i+2)+....+leni*(lenx)
即leni*(sum[x]-sum[i]);
濟南學習 Day 2 T3 am
問題描述 m m的方陣上有n棵蔥,你要修一些柵欄把它們圍起來。乙個柵欄是一段 沿著網格建造的封閉圖形 即要圍成一圈 各個柵欄之間應該不相交 不重疊 且互相不包含。如果你最多修k個柵欄,那麼所有柵欄的長度之和最小是多少?輸入格式 第一行三個整數m,k,n。接下來n行每行兩個整數x,y代表某棵蔥的位置。...
濟南學習 Day 3 T3 am
選數字 select time limit 3000ms memory limit 64mb 題目描述 lyk 找到了乙個 n m 的矩陣,這個矩陣上都填有一些數字,對於第 i 行第 j 列的位置上 的數為 ai,j。由於它 ak 了 noip2016 的初賽,最近顯得非常無聊,便想到了乙個方法自娛...
濟南學習 Day 5 T3 am
題目描述 眾所不知,rly現在不會玩西洋棋。但是,作為乙個oier,rly當然做過八皇后問題.在這裡再囉嗦幾句,皇后可以攻擊到同行同列同對角線,在 n n的棋盤中,擺放n個皇后使它們互相不能攻擊到,求不同的解的數量,這就是經典的n皇后問題。現在問題推廣n皇后問題,這個問題對你而言實 在是小菜一碟。但...