feat: 添加P7960和P7961题解并优化P5835代码

添加两道新题目的解决方案:
1. P7960.cpp实现数字7相关筛选算法
2. P7961.cpp实现组合数学问题的DFS解法

优化P5835.cpp的逆序对计算:
- 修改合并排序的比较条件
- 改进权重分配逻辑
- 增加代码可读性和注释
This commit is contained in:
Zengtudor 2025-10-23 17:59:16 +08:00
parent f85c0df2f1
commit a339d17df5
3 changed files with 109 additions and 6 deletions

View File

@ -4,6 +4,7 @@
#include <iostream>
#include <istream>
#include <map>
#include <string>
#include <unordered_set>
#include <vector>
using ll = int64_t;
@ -29,7 +30,7 @@ static inline ll merge(std::vector<ll>&num,std::vector<ll>&tmp,ll l,ll mid,ll r)
ll cnt=0;
ll i=l,j=mid+1,k=l;
while(i<=mid&&j<=r){
if(num[i]<=num[j]){
if(num[i]<num[j]){
tmp[k++]=num[i++];
}else{
cnt+= mid-i+1;
@ -77,9 +78,14 @@ int main(){
}
std::sort(dis+1,dis+1+n);
ll outweight=0;
ll pout=0;
ll pout=0,lout=1,rout=n;
for(ll i=1;i<=n;i++){
outweight+=c[dis[i].idx].w;
if(c[dis[i].idx].d==1){
outweight+=c[rout--].w;
}else{
outweight+=c[lout++].w;
}
// outweight+=c[dis[i].idx].w;
// printf("%lld is out\n",c[dis[i].idx].x);
pout=dis[i].d;
vis.emplace(dis[i].idx);
@ -95,8 +101,9 @@ int main(){
// std::cout<<"\n";
after.push_back(0);
for(ll i=1;i<=n;i++){
after.push_back(c[i].x+c[i].d*pout);
ll na=c[i].x+c[i].d*pout;
after.push_back(na);
}
std::cout<<mergesort(after, tmp, 1, n)<<"\n";
const ll ans = mergesort(after, tmp, 1, n);
std::cout<<ans<<"\n";
}

44
src/10/23/P7960.cpp Normal file
View File

@ -0,0 +1,44 @@
#include <bitset>
#include <cstdint>
#include <iostream>
#include <istream>
#include <string>
using ll = int64_t;
const ll maxn = 1e7+7;
std::bitset<maxn> isnot;
ll nxtpos[maxn];
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
for(ll i=1;i<maxn;i++){
const std::string str = std::to_string(i);
for(char c:str){
if(c=='7'){
for(ll j=1;j*i<maxn;j++){
isnot[i*j]=true;
}
break;
}
}
}
for(ll i=maxn-1;i>=1;i--){
static ll last = maxn;
last = (isnot[i]?last:i);
nxtpos[i]=last;
}
ll t;
std::cin>>t;
while(t--){
ll x;
std::cin>>x;
if(isnot[x]){
std::cout<<"-1\n";
continue;
}
x++;
std::cout<<nxtpos[x]<<"\n";
}
}

52
src/10/23/P7961.cpp Normal file
View File

@ -0,0 +1,52 @@
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
using ll = int64_t;
using int128=__int128;
const ll maxn = 107,p=998244353;
ll n,m,k,v[maxn],sa[maxn],ans;
static inline ll popcount(int128 n){
ll ans=0;
while(n){
ans++;
n-=(n&-n);
}
return ans;
}
static inline void getans(int128 add){
// printf("getans %lld popcount=%lld\n",add,popcount(add));
if(popcount(add)>k){
// printf("popcount >k\n");
return;
}
ll nans=1;
for(ll i=1;i<=n;i++){
nans=nans*v[sa[i]]%p;
}
ans=(ans+nans)%p;
}
static inline void dfs(ll idx,int128 add){
// printf("dfs %lld %lld\n",idx, add);
if(idx>n){
getans(add);
return;
}
for(ll i=0;i<=m;i++){
sa[idx]=i;
dfs(idx+1,add+(1ll<<i));
}
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m>>k;
for(ll i=0;i<=m;i++){
std::cin>>v[i];
}
dfs(1, 0);
std::cout<<ans<<"\n";
}