update
This commit is contained in:
parent
fc5fc3cbd5
commit
7c01a98c26
@ -1,4 +1,7 @@
|
|||||||
|
//30%Points k==1
|
||||||
|
|
||||||
#include<bits/stdc++.h>
|
#include<bits/stdc++.h>
|
||||||
|
#include <cstdlib>
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
struct Node{
|
struct Node{
|
||||||
@ -8,19 +11,45 @@ struct Node{
|
|||||||
|
|
||||||
const int MAX_N = 2e5+5;
|
const int MAX_N = 2e5+5;
|
||||||
int n,m,k;
|
int n,m,k;
|
||||||
int t[MAX_N];
|
Node nodes[MAX_N];
|
||||||
Node map[MAX_N];
|
|
||||||
|
|
||||||
int readint();
|
int readint();
|
||||||
|
void AC_KE_Q1();
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
n=readint(),m=readint(),k=readint();
|
n=readint(),m=readint(),k=readint();
|
||||||
for(int i=1;i<=n;i++){
|
for(int i=1;i<=n;i++){
|
||||||
t[i]=readint();
|
nodes[i].t=readint();
|
||||||
}
|
}
|
||||||
|
if(k==1){AC_KE_Q1();exit(0);}
|
||||||
|
|
||||||
|
}
|
||||||
|
void AC_KE_Q1(){
|
||||||
for(int i=1;i<=m;i++){
|
for(int i=1;i<=m;i++){
|
||||||
|
const int u=readint(),v=readint();
|
||||||
|
nodes[u].next.push_back(v);
|
||||||
|
nodes[v].next.push_back(u);
|
||||||
}
|
}
|
||||||
|
bool isUPrint = false;
|
||||||
|
for(int i=1;i<=n;i++){
|
||||||
|
if (!isUPrint) {
|
||||||
|
bool canPrint = true;
|
||||||
|
for(auto i:nodes[i].next){
|
||||||
|
if(i==n){
|
||||||
|
canPrint=false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(canPrint){
|
||||||
|
cout<<"U";
|
||||||
|
isUPrint=true;
|
||||||
|
goto printed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cout<<"P";
|
||||||
|
printed:;
|
||||||
|
}
|
||||||
|
cout<<endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
int readint(){
|
int readint(){
|
||||||
|
@ -1,63 +1,54 @@
|
|||||||
//暴力30Points
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include<bits/stdc++.h>
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
#define int long long
|
|
||||||
|
|
||||||
const int MAX_N = 1000+5;
|
const int MAX_N = 1000;
|
||||||
int a[MAX_N];
|
const int MAX_A = 1e9;
|
||||||
int n,amax=INT_MIN,ans=0;
|
|
||||||
unordered_map<int,long long> um;
|
|
||||||
int readint();
|
|
||||||
|
|
||||||
signed main(signed argc,char *argv[]){
|
|
||||||
#ifdef OITEST
|
|
||||||
#define AS_EQ(a,b){if((a)!=(b)){cerr<<"assert eq faild:"<<endl<<#a<<":"<<(a)<<endl<<#b<<":"<<(b)<<endl;exit(-1);}}
|
|
||||||
#define AS_NE(a,b){if((a)==(b)){cerr<<"assert not eq faild:"<<endl<<#a<<":"<<(a)<<endl<<#b<<":"<<(b)<<endl;exit(-1);}}
|
|
||||||
AS_EQ(argc,3)
|
|
||||||
auto fin = freopen(argv[1],"r",stdin);
|
|
||||||
AS_NE(fin,NULL)
|
|
||||||
ifstream afile(argv[2]);
|
|
||||||
AS_EQ(afile.is_open(),true);
|
|
||||||
|
|
||||||
#endif
|
vector<int> sieve(int limit) {
|
||||||
n=readint();
|
vector<bool> is_prime(limit + 1, true);
|
||||||
for(int i=1;i<=n;i++){
|
vector<int> primes;
|
||||||
a[i]=readint();
|
is_prime[0] = is_prime[1] = false;
|
||||||
}
|
for (int i = 2; i <= limit; ++i) {
|
||||||
for(int i=1;i<=n;i++){
|
if (is_prime[i]) {
|
||||||
int num=a[i];
|
primes.push_back(i);
|
||||||
for(int j=2;j<=sqrt(a[i]);j++){
|
for (int j = i * 2; j <= limit; j += i) {
|
||||||
if(num%j==0){
|
is_prime[j] = false;
|
||||||
um[j]+=a[i];
|
|
||||||
while(num%j==0)num/=j;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(num>1){
|
|
||||||
um[num]+=a[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
for(auto i : um){
|
return primes;
|
||||||
ans+=i.second;
|
}
|
||||||
}
|
|
||||||
cout<<ans<<endl;
|
|
||||||
#ifdef OITEST
|
|
||||||
int cans;
|
|
||||||
afile>>cans;
|
|
||||||
AS_EQ(ans,cans)
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int readint(){
|
int main() {
|
||||||
int x=0,w=1;
|
int n;
|
||||||
char ch=0;
|
cin >> n;
|
||||||
while(!isdigit(ch)){
|
vector<int> a(n);
|
||||||
if(ch=='-')w=-1;
|
for (int i = 0; i < n; ++i) {
|
||||||
ch=getchar();
|
cin >> a[i];
|
||||||
}
|
}
|
||||||
while(isdigit(ch)){
|
|
||||||
x=x*10+(ch-'0');
|
int sqrt_max_a = sqrt(MAX_A);
|
||||||
ch=getchar();
|
vector<int> primes = sieve(sqrt_max_a);
|
||||||
|
|
||||||
|
int max_sum = 0;
|
||||||
|
|
||||||
|
|
||||||
|
for (int p : primes) {
|
||||||
|
int current_sum = 0;
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
if (a[i] % p == 0) {
|
||||||
|
current_sum += a[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
max_sum = max(max_sum, current_sum);
|
||||||
}
|
}
|
||||||
return x*w;
|
|
||||||
}
|
cout << max_sum << endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
88
day12/U466180/chat.md
Normal file
88
day12/U466180/chat.md
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
这道题的目标是找到一个子序列,使得该子序列中的所有元素都可以被某个大于1的整数$k$整除,并且该子序列的和最大。要实现这一点,我们可以考虑以下思路:
|
||||||
|
|
||||||
|
### 思路解析
|
||||||
|
|
||||||
|
1. **选择质数作为$k$:**
|
||||||
|
对于每一个质数$k$,如果序列中的所有元素都是$k$的倍数,那么这个子序列显然是合法的。因此,我们的目标就是找到一个质数$k$,使得从原序列中取出的所有$k$的倍数之和最大。
|
||||||
|
|
||||||
|
2. **枚举质数$k$:**
|
||||||
|
由于$k$必须是一个大于1的整数,所以我们只需要枚举所有可能的质数$k$,并计算原序列中所有是$k$倍数的元素之和。然后取这些和中的最大值作为结果。
|
||||||
|
|
||||||
|
3. **复杂度分析:**
|
||||||
|
由于题目给出的$ a_i $最大可以达到$ 10^9 $,所以质数的范围实际上是受限的。质数的个数大约为$O(\sqrt{a_i})$,因此枚举所有质数的复杂度是可以接受的。对于每个质数$k$,我们需要遍历整个序列以找到所有的$k$倍数,最终复杂度为$O(n\sqrt{a_i})$。
|
||||||
|
|
||||||
|
### 实现步骤
|
||||||
|
|
||||||
|
1. **筛选质数:**
|
||||||
|
使用埃氏筛法或者其他方法来筛选出$[2,\sqrt{10^9}]$范围内的所有质数。
|
||||||
|
|
||||||
|
2. **计算每个质数对应的合法子序列的和:**
|
||||||
|
对于每个筛选出的质数$k$,遍历原序列$ a_1, a_2, \dots, a_n $,计算其中所有是$k$倍数的元素的和。
|
||||||
|
|
||||||
|
3. **取最大值:**
|
||||||
|
在所有质数对应的和中取一个最大值作为结果输出。
|
||||||
|
|
||||||
|
### 代码实现
|
||||||
|
|
||||||
|
以下是该思路的一个简单实现:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <cmath>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
const int MAX_N = 1000;
|
||||||
|
const int MAX_A = 1e9;
|
||||||
|
|
||||||
|
// 埃氏筛法生成质数
|
||||||
|
vector<int> sieve(int limit) {
|
||||||
|
vector<bool> is_prime(limit + 1, true);
|
||||||
|
vector<int> primes;
|
||||||
|
is_prime[0] = is_prime[1] = false;
|
||||||
|
for (int i = 2; i <= limit; ++i) {
|
||||||
|
if (is_prime[i]) {
|
||||||
|
primes.push_back(i);
|
||||||
|
for (int j = i * 2; j <= limit; j += i) {
|
||||||
|
is_prime[j] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return primes;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int n;
|
||||||
|
cin >> n;
|
||||||
|
vector<int> a(n);
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
cin >> a[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
int sqrt_max_a = sqrt(MAX_A);
|
||||||
|
vector<int> primes = sieve(sqrt_max_a);
|
||||||
|
|
||||||
|
int max_sum = 0;
|
||||||
|
|
||||||
|
// 枚举质数
|
||||||
|
for (int p : primes) {
|
||||||
|
int current_sum = 0;
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
if (a[i] % p == 0) {
|
||||||
|
current_sum += a[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
max_sum = max(max_sum, current_sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
cout << max_sum << endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 进一步优化
|
||||||
|
|
||||||
|
在实际实现中,还可以考虑跳过不必要的计算,尤其是当发现某个质数的倍数已经产生很大和时,可以终止不必要的继续计算。此外,如果序列中的元素全部为质数,则可以直接跳过筛选质数的步骤,只计算质数本身。
|
40
day12/U466180/tx.cpp
Normal file
40
day12/U466180/tx.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include<bits/stdc++.h>
|
||||||
|
#define int long long
|
||||||
|
using namespace std;
|
||||||
|
int n;
|
||||||
|
int a[1005];
|
||||||
|
int zs[50005];
|
||||||
|
int tot;
|
||||||
|
signed main(){
|
||||||
|
ios::sync_with_stdio(0);
|
||||||
|
cin.tie(0);cout.tie(0);
|
||||||
|
cin>>n;
|
||||||
|
for(int i=1;i<=n;i++)cin>>a[i];
|
||||||
|
for(int i=1;i<=n;i++){
|
||||||
|
int t=a[i];
|
||||||
|
for(int j=2;j*j<=t;j++){
|
||||||
|
if(t%j==0){
|
||||||
|
zs[++tot]=j;
|
||||||
|
// cout<<j<<" ";
|
||||||
|
while(t%j==0)t/=j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(t>1){
|
||||||
|
//cout<<t<<" ";
|
||||||
|
zs[++tot]=t;
|
||||||
|
}
|
||||||
|
//cout<<endl;
|
||||||
|
}
|
||||||
|
sort(zs+1,zs+tot+1);
|
||||||
|
tot=unique(zs+1,zs+tot+1)-zs-1;
|
||||||
|
int ans=0;
|
||||||
|
for(int i=1;i<=tot;i++){
|
||||||
|
int now=0;
|
||||||
|
int tt=zs[i];
|
||||||
|
for(int j=1;j<=n;j++){
|
||||||
|
if(a[j]%tt==0)now+=a[j];
|
||||||
|
}
|
||||||
|
ans=max(ans,now);
|
||||||
|
}
|
||||||
|
cout<<ans;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user