[ABC286F]
[ABC286F] Guess The Number 2
题意转换:
有一个数
思路:
可以发现当
由于
于是,我们考虑构造若干个环(我们假定对于大小为
我们只要让
为了保证解的唯一性和序列长度限制,需要满足
取
我们把
注意尽管最终答案不超过 long long
。
#include<cstdio>
#include<iostream>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
const int p[]={4,9,5,7,11,13,17,19,23},N=sizeof(p)/sizeof(p[0]);
int m,mul=1;
typedef long long ll;
int exgcd(int a,int b,int &x,int &y){
if(!b){
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main(){
#ifndef ONLINE_JUDGE
// freopen("1.in","r",stdin);
#endif
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cout<<"108\n";
int sum=1;
L(i, N){
E(j, p[i]-1)
cout<<sum+j<<' ';
cout<<sum<<' ';
sum+=p[i];
mul*=p[i];
}
cout<<endl;
sum=1;
ll ans=0;
L(i, N){
int x;
cin>>x;
//n===x-sum(mod p[i])
ll a=x-sum;
int M=mul/p[i];
int t1,t2;
exgcd(M,p[i],t1,t2);
ans+=a*M*(t1<0?t1+p[i]:t1);
L(j, p[i]-1)cin>>x;
sum+=p[i];
}
cout<<ans%mul;
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17737022.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步