社区讨论
WA求调
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mdd2xx2l
- 此快照首次捕获于
- 2025/07/21 20:26 8 个月前
- 此快照最后确认于
- 2025/11/04 03:59 4 个月前
目前 的部分测试过,没问题,应该是剩余部分WA掉了
我的代码:
CPP#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const int N=100;
int n;
ull s;
ull b[N+5];
ull exgcd(ull &x,ull &y,ull a,ull b)
{
if(b==0)
{
x=1,y=0;
return a;
}
ull g=exgcd(y,x,b,a%b);
y=y-(a/b)*x;
return g;
}
int ed;
unordered_map<ull,string> mp;
char str[N+5];
void dfs1(int step,ull sum)
{
if(step>ed)
{
mp[sum]=str;
return;
}
str[step-1]='0';
dfs1(step+1,sum);
str[step-1]='1';
dfs1(step+1,sum+b[step]);
}
void dfs2(int step,ull sum)
{
if(step>n)
{
if(mp.count(s-sum))
{
cout<<mp[s-sum];
cout<<str;
cout<<"\n";
exit(0);
}
return;
}
str[step-ed-1]='0';
dfs2(step+1,sum);
str[step-ed-1]='1';
dfs2(step+1,sum+b[step]);
}
void solve1()
{
ed=(n+1)/2;
str[ed]='\0';
dfs1(1,0);
str[n-ed]='\0';
dfs2(ed+1,0);
}
ull a[N+5];
ull A[N+5],S;
bool ans[N+5];
void check(ull ny)//这里检测枚举到的r在模2^64时的逆元是否正确,正确输出答案,否则继续枚举
{
S=s*ny;
for(int i=n;i>=1;i--)
{
A[i]=b[i]*ny;
if(S>=A[i])
{
S-=A[i];
ans[i]=1;
}
}
if(S!=0) return;
for(int i=1;i<=n;i++) cout<<ans[i];
exit(0);
}
void solve2()
{
ull k=0;
ull p=b[1];
while(p%2==0) ++k,p/=2;
ull q=0,d=0,g;
ull pw=1ull<<(64-n);
ull mx=-1;
ull r=0;
ull res1=1ull<<k,res2=1ull<<(64-k);
g=exgcd(q,d,p,res2);
for(a[1]=res1;a[1]<=pw;a[1]+=2*res1)
{
r=a[1]/res1*q;
for(d=1;d<=res1;d++)
{
ull ny=r+d*res2;
check(ny);
}
}
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
cin>>s;
if(n<=45)
{
solve1();
}
else
{
solve2();
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...