diff --git a/day12/U466168/U466168.cpp b/day12/U466168/U466168.cpp index 37823d2..ca6224d 100644 --- a/day12/U466168/U466168.cpp +++ b/day12/U466168/U466168.cpp @@ -1,4 +1,7 @@ +//30%Points k==1 + #include +#include using namespace std; struct Node{ @@ -8,19 +11,45 @@ struct Node{ const int MAX_N = 2e5+5; int n,m,k; -int t[MAX_N]; -Node map[MAX_N]; +Node nodes[MAX_N]; int readint(); +void AC_KE_Q1(); int main(){ n=readint(),m=readint(),k=readint(); 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++){ - + 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< +#include +#include +#include -#include using namespace std; -#define int long long -const int MAX_N = 1000+5; -int a[MAX_N]; -int n,amax=INT_MIN,ans=0; -unordered_map um; -int readint(); +const int MAX_N = 1000; +const int MAX_A = 1e9; -signed main(signed argc,char *argv[]){ - #ifdef OITEST - #define AS_EQ(a,b){if((a)!=(b)){cerr<<"assert eq faild:"< sieve(int limit) { + vector is_prime(limit + 1, true); + vector 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; } } - if(num>1){ - um[num]+=a[i]; - } } - for(auto i : um){ - ans+=i.second; - } - cout<>cans; - AS_EQ(ans,cans) - #endif -} + return primes; +} -int readint(){ - int x=0,w=1; - char ch=0; - while(!isdigit(ch)){ - if(ch=='-')w=-1; - ch=getchar(); +int main() { + int n; + cin >> n; + vector a(n); + for (int i = 0; i < n; ++i) { + cin >> a[i]; } - while(isdigit(ch)){ - x=x*10+(ch-'0'); - ch=getchar(); + + int sqrt_max_a = sqrt(MAX_A); + vector 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; -} \ No newline at end of file + + cout << max_sum << endl; + + return 0; +} diff --git a/day12/U466180/chat.md b/day12/U466180/chat.md new file mode 100644 index 0000000..fe73408 --- /dev/null +++ b/day12/U466180/chat.md @@ -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 +#include +#include +#include + +using namespace std; + +const int MAX_N = 1000; +const int MAX_A = 1e9; + +// 埃氏筛法生成质数 +vector sieve(int limit) { + vector is_prime(limit + 1, true); + vector 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 a(n); + for (int i = 0; i < n; ++i) { + cin >> a[i]; + } + + int sqrt_max_a = sqrt(MAX_A); + vector 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; +} +``` + +### 进一步优化 + +在实际实现中,还可以考虑跳过不必要的计算,尤其是当发现某个质数的倍数已经产生很大和时,可以终止不必要的继续计算。此外,如果序列中的元素全部为质数,则可以直接跳过筛选质数的步骤,只计算质数本身。 \ No newline at end of file diff --git a/day12/U466180/tx.cpp b/day12/U466180/tx.cpp new file mode 100644 index 0000000..8ac73b7 --- /dev/null +++ b/day12/U466180/tx.cpp @@ -0,0 +1,40 @@ +#include +#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<1){ + //cout<