数论:
1.素数(质数)
①定义法:O(n)
n> = 2 && i <= n-1
②プロパティメソッド:O(sqrt(n))
はペアで表示されます
。dがnを除算できる場合、n / dもnを除算できます
。dとn / dがペアである
場合は、小さい方に列挙するだけで済みます。
回答:d <= n / d、
d d <= n PS:この書き込み方法は推奨されません。nがintの最大値に近い場合、ddにオーバーフローのリスクがある可能性があります。
d <= sqrt(n)PS:関数が毎回呼び出され、非効率的であるため、この書き込み方法はお勧めしません。
2.
除数は
素数の反対であり、慣習は素数と同じです。
統合コレクション:836。統合コレクションの
タイトルリンク
以前に学んだクルスカルと同じです
#include<iostream>
using namespace std;
const int N=100000+10;
int n,m;
int father[N];
int find(int x){
return father[x]==x?x:father[x]=find(father[x]);
}
void my_union(int a, int b){
int xx=find(a);
int yy=find(b);
if(xx!=yy){
if(yy>xx){
father[yy]=xx;
}else{
father[xx]=yy;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
father[i]=i;
}
while(m--){
char s[2];
int a,b;
cin>>s>>a>>b;
if(s[0]=='M'){
my_union(a,b);
}else{
if(find(a)==find(b)){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
}
return 0;
}
ユニオン検索セットの拡張アプリケーション:
837。接続されたブロック内のポイント数への
リンク
元のコードをマージして収集したことに基づいて変換します。
#include<iostream>
using namespace std;
const int N=100000+10;
int n,m;
int father[N];
int se[N];
int find(int x){
return father[x]==x?x:father[x]=find(father[x]);
}
void my_union(int a, int b){
int xx=find(a);
int yy=find(b);
if(xx!=yy){
if(yy>xx){
se[xx]+=se[yy];
father[yy]=xx;
}else{
se[yy]+=se[xx];
father[xx]=yy;
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
father[i]=i;
se[i]=1;
}
while(m--){
char s[5];
int a,b;
cin>>s;
if(s[0]=='C'){
cin>>a>>b;
my_union(a,b);
}else if(s[1]=='1'){
cin>>a>>b;
if(find(a)==find(b)){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}else{
cin>>a;
int f=find(a);
cout<<se[f]<<endl;
}
}
return 0;
}
240.食物連鎖と収集実践の質問
ps:dpでメモ化された検索の再帰形式(再帰として記述された場合、間隔dpの方が理解しやすい)