BC div2補題以及 復習模除 逆元__BestCoder Round #78 (div.2)

 第一題沒話說 智商欠費 加老柴輔導終于過了

需要在意的是數據范圍為2的63次方-1 三個數相加肯定爆了

?? 四邊形的定義  任意邊小于其余三邊之和

換句話說就是  最長邊小于其余三邊之和

?? 這樣的話問題轉化為 最長邊依次減其余三邊的結果是否小于等于0

還有一點是題目出現0邊 即最小邊不為0 想得太多反而把0也算為合法。。。。

?? 問題只需要 sort一下 判斷a[0]==0||a[3]-a[2]-a[1]-a[0]>=0 輸出NO //存在0邊且最大邊大于其他邊之和

第二題 好多種姿勢 題目鏈接http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=683&pid=1002

官方題解

  我們令dp[i][j]表示在前i個數中,選出若干個數使得它們的gcd為j的方案數,于是只需要枚舉第i+1個數是否被選中來轉移就可以了

令第i+1個數為v,當考慮dp[i][j]的時候,我們令$dp[i+1][j] += dp[i]j,dp[i+1][gcd(j,v)] += dp[i]j

復雜度O(N*MaxV) MaxV 為出現過的數的最大值

其實有O(MaxV *log(MaxV))的做法,我們考慮記f[i]表示從這些數中選擇若干個數,使得他們的gcd是i的倍數的方案數。假如有K個數是i的倍數,則 f[i]=2^K-1,再用g[i]表示從這些數中選擇若干個數,使得他們的gcd是i的方案數,則g[i]=f[i] - g[j] (對于所有j是i的倍數)。

由調和級數可以得到復雜度為O(MaxV *log(MaxV))

DP之二維數組轉移

  我們把dp[i][j]作為考慮了第i個數GCD為j的方案數

直接gcd會超時 所以我們打個表GCD

  那么dp[i][j]+=dp[i-1][j]; dp[i][GCD[j][v[i]]]+=dp[i-1][j]; 然后就可以轉移辣;

#include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<cstdlib>
#include<climits>
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+7;
const int64 Mod=100000007;
const double eps=1e-9;
const int N=1005;
const int MAXN=250050;
typedef int rl;
inline void r(rl&num){num=0;rl f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();num*=f;
}
int gcd(int a,int b)
{return b==0?a:gcd(b,a%b);
}
int v[N];
int GCD[N][N];
int64 dp[N][N];
int main()
{for(int i=1;i<1001;i++){for(int j=1;j<=i;j++){GCD[i][j]=GCD[j][i]=gcd(i,j);}}int ci;r(ci);while(ci--){int n;r(n);int mx=-1;for(int i=1;i<=n;i++){r(v[i]);mx=max(mx,v[i]);dp[i][v[i]]=1;}for(int i=2;i<=n;i++){for(int j=1;j<=mx;j++){dp[i][j]+=dp[i-1][j];dp[i][j]%=Mod;dp[i][GCD[j][v[i]]]+=dp[i-1][j];dp[i][GCD[j][v[i]]]%=Mod;}}int64 ans=0;for(int i=1;i<=mx;i++){ans+=(dp[n][i]*i)%Mod;ans%=Mod;}memset(dp,0,sizeof(dp));memset(v,0,sizeof(v));printf("%I64d\n",ans);}return 0;
}
二維

仔細想了一下 覺得可以優化為滾動數組 試了好久不對 最后瞎蒙

每個數都多考慮了一次 所以/2需要乘逆元 正好1e8+7是素數

Mod為素數,那么還可以根據費馬小定理得到逆元為 2的(Mod-2)次方%Mod

  即除2等于乘2的(Mod-2)次方%Mod

所以加了一個快速冪 但是優化為滾動數組后 時間增加了一丟丟 但空間大幅度減少

167578622016-04-03 12:45:34Accepted56562511MS5504K1925 BG++zxMrlc
167557982016-04-03 00:36:10Accepted56562449MS13404K1722 BG++zxMrlc

但是姿勢老感覺有問題 等wtw學長指點后我再改改 還有官方的第二個姿勢還沒有學會。。。衰

#include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<cstdlib>
#include<climits>
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+7;
const int64 Mod=100000007;
const double eps=1e-9;
const int N=1005;
const int MAXN=250050;
typedef int rl;
inline void r(rl&num){num=0;rl f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();num*=f;
}
int gcd(int a,int b)
{return b==0?a:gcd(b,a%b);
}
int v[N];
int GCD[N][N];
int64 dp[N];
int main()
{int64 xx=Mod-2;int64 an=1,t=2;while(xx>0){if(xx&1) an*=t;xx/=2;an%=Mod;t*=t;t%=Mod;}for(int i=1;i<1001;i++){for(int j=1;j<=i;j++){GCD[i][j]=GCD[j][i]=gcd(i,j);}}int ci;r(ci);while(ci--){int n;r(n);int mx=-1;for(int i=1;i<=n;i++){r(v[i]);mx=max(mx,v[i]);}for(int i=1;i<=n;i++){dp[v[i]]++;for(int j=1;j<=mx;j++){// dp[i][j]+=dp[i-1][j];dp[j]%=Mod;dp[GCD[j][v[i]]]+=dp[j];dp[GCD[j][v[i]]]%=Mod;}}int64 ans=0;//for(int i=1;i<=mx;i++) cout<<dp[i]<<endl;for(int i=1;i<=mx;i++){ans+=(dp[i]*i)%Mod;ans%=Mod;}memset(dp,0,sizeof(dp));memset(v,0,sizeof(v));printf("%I64d\n",ans*an%Mod);}return 0;
}
滾動數組

?我們每次加入的數據會導致翻倍 所以剛才改為加完/2;

因為添加的v[i]導致的影響就是 當前位置dp[v[i]]多1 即方案數多了選自己的 所以在循環結尾-1就ok了 。。。根本不需要模除 但時間特么變大了

還是有點模糊的 不太清楚到底怎么回事。

167581632016-04-03 13:17:49Accepted56562636MS5504K1730 BG++zxMrlc

?

#include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<cstdlib>
#include<climits>
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+7;
const int64 Mod=100000007;
const double eps=1e-9;
const int N=1005;
const int MAXN=250050;
typedef int rl;
inline void r(rl&num){num=0;rl f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();num*=f;
}
int gcd(int a,int b)
{return b==0?a:gcd(b,a%b);
}
int v[N];
int GCD[N][N];
int64 dp[N];
int main()
{for(int i=1;i<1001;i++){for(int j=1;j<=i;j++){GCD[i][j]=GCD[j][i]=gcd(i,j);}}int ci;r(ci);while(ci--){int n;r(n);int mx=-1;for(int i=1;i<=n;i++){r(v[i]);mx=max(mx,v[i]);}for(int i=1;i<=n;i++){dp[v[i]]++;for(int j=1;j<=mx;j++){// dp[i][j]+=dp[i-1][j];dp[j]%=Mod;dp[GCD[j][v[i]]]+=dp[j];dp[GCD[j][v[i]]]%=Mod;}dp[v[i]]--;}int64 ans=0;for(int i=1;i<=mx;i++){ans+=(dp[i]*i)%Mod;ans%=Mod;}memset(dp,0,sizeof(dp));memset(v,0,sizeof(v));printf("%I64d\n",ans%Mod);}return 0;
}
滾動第二次優化

?

轉載于:https://www.cnblogs.com/Geek-xiyang/p/5349677.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374926.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374926.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374926.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

習題6-1 分類統計字符個數 (15 分)

本題要求實現一個函數&#xff0c;統計給定字符串中英文字母、空格或回車、數字字符和其他字符的個數。 函數接口定義&#xff1a; void StringCount( char s[] );其中 char s[] 是用戶傳入的字符串。函數StringCount須在一行內按照 letter 英文字母個數, blank 空格或回車…

Servlet 3.0異步處理可將服務器吞吐量提高十倍

Servlet是Java中處理服務器端邏輯的主要組件&#xff0c;新的3.0規范引入了一些非常有趣的功能&#xff0c;其中異步處理是最重要的功能之一。 可以利用異步處理來開發高度可伸縮的Web應用程序。 使用此功能可以有效地構建Web 2.0站點和AJAX應用程序。 我們的JCG合作伙伴之一To…

使用secureCRT連接VMware-Ubuntukylin虛擬機

使用SecureCRT連接VMware時總是提醒主機拒絕連接。這時可以使用sudo apt-get install openssh-server openssh-client&#xff0c;在主機上安裝ssh. 安裝成功后&#xff0c;可以連接到主機了。 如果顯示遠程主機拒絕連接。則可以使用如下方法。 VMware里面裝的是Ubuntukylin版本…

加載音頻Audio

var cameraAudio new Audio(); cameraAudio.src camera.wav;// 設置音頻對象的屬性,預加載視頻 var options_audio { preload : auto } for(var key in options_audio){ if(options_audio.hasOwnProperty(key) && (key in cameraAudio)){ cameraAudio[key] opti…

習題6-2 使用函數求特殊a串數列和 (20 分)

給定兩個均不超過9的正整數a和n&#xff0c;要求編寫函數求aaaaaa?aa?a&#xff08;n個a&#xff09;之和。 int fn( int a, int n ); int SumA( int a, int n );其中函數fn須返回的是n個a組成的數字&#xff1b;SumA返回要求的和。 我的代碼&#xff1a; int fn( int a, i…

Java中可怕的雙重檢查鎖定成語

本文討論的問題不是新問題&#xff0c;但即使是經驗豐富的開發人員也仍然很棘手。 單例模式是常見的編程習慣。 但是&#xff0c;當與多個線程一起使用時&#xff0c;必須進行某種類型的同步&#xff0c;以免破壞代碼。 Khangaonkar報告中的 JCG合作伙伴Manoj Khangaonkar在一篇…

國內有哪些好的刷題網站?

http://www.zhihu.com/question/25574458 Luau Lawrence&#xff0c;Data Mining 弱雞 / PhDNTU 溫夢強、石一帆、知乎用戶 等人贊同 - Welcome To PKU JudgeOnline 北京大學的Online Judge。POJ上面的題目有點老了&#xff0c;但好處是做的人多&#xff0c;經典算法題多&…

IE版本判斷

我們常常會在網頁的HTML里面看到形如[if lte IE 9]……[endif]的代碼&#xff0c;表示的是限定某些瀏覽器版本才能執行的語句&#xff0c;那么這些判斷語句的規則是什么呢&#xff1f;請看下文&#xff1a; <!--[if !IE]><!--> 除IE外都可識別 <!--<![endif]…

Js 流程控制

流程控制 順序、分支、循環 順序結構 代碼一行一行從上往下執行并解析 分支結構 if語句 switch語句 if語句 單分支 if(條件表達式){ //語句塊 } 含義&#xff1a;當條件表達式為真的時候就執行里面的語句塊 示例&#xff1a; 雙分支&#xff1a; if(條件表達式){ //語句塊1 }el…

習題6-3 使用函數輸出指定范圍內的完數 (20 分)

本題要求實現一個計算整數因子和的簡單函數&#xff0c;并利用其實現另一個函數&#xff0c;輸出兩正整數m和n&#xff08;0<m≤n≤10000&#xff09;之間的所有完數。所謂完數就是該數恰好等于除自身外的因子之和。例如&#xff1a;6123&#xff0c;其中1、2、3為6的因子。…

速覽Java 7 MethodHandle及其用法

由于Java的Reflection API&#xff0c;我們已經能夠在運行時檢查和更改程序執行。 特別是&#xff0c;我們可以在運行時觀察接口/類/方法和字段&#xff0c;而在編譯時不知道它們的名稱。 JDK 7為這種動態/運行時檢查引入了一個新的參與者&#xff0c;即方法句柄&#xff08;即…

習題6-4 使用函數輸出指定范圍內的Fibonacci數 (20 分)

本題要求實現一個計算Fibonacci數的簡單函數&#xff0c;并利用其實現另一個函數&#xff0c;輸出兩正整數m和n&#xff08;0<m≤n≤10000&#xff09;之間的所有Fibonacci數。所謂Fibonacci數列就是滿足任一項數字是前兩項的和&#xff08;最開始兩項均定義為1&#xff09;…

SmartGWT入門,提供出色的GWT界面

SmartGWT簡介 我最近開始使用SmartGWT &#xff0c;它是一個基于GWT的框架&#xff0c;該框架為您的應用程序UI提供了一個全面的小部件庫&#xff0c;并為服務器端的數據管理提供了幫助。 您可以在SmartGWT展示柜上查看其漂亮的功能。 我準備了一個簡短的“入門”指南&#xf…

Android OpenGL ES(四)----調整屏幕的寬高比

1.寬高比問題 我們現在相當熟悉這樣一個事實&#xff0c;在OpenGL里&#xff0c;我們要渲染的一切物體都要映射到X軸和Y軸上[-1&#xff0c;1]的范圍內&#xff0c;對于Z軸也一樣。這個范圍內的坐標被稱為歸一化設備坐標&#xff0c;其獨立于屏幕實際尺寸或形狀。 不幸的是&…

使用Spring AOP進行面向方面的編程

面向方面的編程&#xff08;AOP&#xff09;是指將輔助功能或支持功能與主程序的業務邏輯隔離開來的編程范例。 AOP是用于分離橫切關注點的有前途的技術&#xff0c;這在面向對象的編程中通常很難做到。 以此方式增加了應用程序的模塊化&#xff0c;并且維護變得非常容易。 橫切…

面試題24 二叉搜索樹的后序遍歷序列

題目描述 輸入一個整數數組&#xff0c;判斷該數組是不是某二叉搜索樹的后序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。1 class Solution {2 public:3 bool VerifySquenceOfBST(vector<int> sequence) {4 if (seque…

習題6-5 使用函數驗證哥德巴赫猜想 (20 分)

本題要求實現一個判斷素數的簡單函數&#xff0c;并利用該函數驗證哥德巴赫猜想&#xff1a;任何一個不小于6的偶數均可表示為兩個奇素數之和。素數就是只能被1和自身整除的正整數。注意&#xff1a;1不是素數&#xff0c;2是素數。 函數接口定義&#xff1a; int prime( int…

Linux學習筆記 (六)用戶管理命令

一、用戶帳號 1、超級用戶&#xff1a;具有操作系統中的最高權限&#xff0c;用來管理和維護操作系統。root用戶。 2、普通用戶&#xff1a;由root用戶來創建&#xff0c;在宿主目錄中具有完全權限。 3、程序用戶&#xff1a;由應用程序添加&#xff0c;維護某個應用程序運行。…

使用Spring Security保護GWT應用程序

在本教程中&#xff0c;我們將看到如何將GWT與Spring的安全模塊&#xff08;即Spring Security&#xff09;集成在一起。 我們將看到如何保護GWT入口點&#xff0c;如何檢索用戶的憑據以及如何記錄各種身份驗證事件。 此外&#xff0c;我們將實現自定義身份驗證提供程序&#x…

用Fragment制作的Tab頁面產生的UI重疊問題

本文出處&#xff1a;http://blog.csdn.net/twilight041132/article/details/43812745 在用Fragment做Tab頁面&#xff0c;發現有時候進入應用會同時顯示多個Tab內容&#xff0c;UI發生重疊。 當應用被強行關閉后&#xff08;通過手機管家軟件手動強關&#xff0c;或系統為節省…