日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

n%i之和

發布時間:2024/4/11 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 n%i之和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1168

?

?

題意:給定一個n,注意這里n小于10^12,求

?

分析:早些時候就做過一道題,在這里:http://blog.csdn.net/acdreamers/article/details/8809517

由于當時這題數據小,直接計算步長更方便,但是對于本題由于10^12就不合適了,那么我們就采用第二種方法,現

在我就分別簡略說說這兩種方法,其實大體思路差不多,只是處理不一樣。

?

首先是不可能直接枚舉的,那么我們先把寫成,所以問題變為求:

?

由于在一定范圍內是保持不變的,所以我們接下來可以把時間復雜度降到

?

現在我們簡略模擬一下:比如n=30,那么我們可以劃分等價類:

?

?

可以看出,我們第一個和最后一個組合,第二個和倒數第二個組合,等等,如此進行下去,注意如果是奇數項,中間的那個只被加一次,這樣我們只需要枚舉到就行了。這個方法很好,其實還有一個相對還算可以方法,那么就是

記錄每個等價類的首元素和尾元素,每次跳一段長度,這樣對于10^9數據完全沒有問題。

?

本題由于數據很大,所以用Java大數:

import java.math.BigInteger; import java.util.Scanner; import java.math.*;public class Main {public static BigInteger Solve(long n){BigInteger ans=BigInteger.ZERO;long i,t=(long) Math.sqrt(n*1.0);for(i=1L;i<=t;i++){BigInteger a=BigInteger.valueOf(n/i+n/(i+1)+1); BigInteger b=BigInteger.valueOf(n/i-n/(i+1));BigInteger temp=BigInteger.ZERO;if(i!=(n/i))temp= (a.multiply(b)).divide(BigInteger.valueOf(2));BigInteger c=BigInteger.valueOf(n/i);BigInteger ret=c.add(temp);ret=ret.multiply(BigInteger.valueOf(i));ans=ans.add(ret);}return ans;}public static void main(String[] args){Scanner cin = new Scanner(System.in);while(cin.hasNextLong()){long n=cin.nextLong();BigInteger x=BigInteger.valueOf(n);System.out.println((x.multiply(x)).subtract(Solve(n)));}} }


?

總結

以上是生活随笔為你收集整理的n%i之和的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。