[随机化] HDU 5478 Can you find it
2016-07-13 16:31
316 查看
可以发现一个a对应一个b
枚举a
n=1时求出b
然后随机化验证是否恒成立
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
ll P,k1,k2,b1;
inline ll Pow(ll a,int b){
ll ret=1;
for (;b;b>>=1,a=a*a%P)
if (b&1)
ret=ret*a%P;
return ret;
}
inline bool check(ll a,ll b){
int Test=300;
while (Test--)
{
int n=rand()%P+1;
if ((Pow(a,(k1*n+b1)%(P-1))+Pow(b,(k2*(n-1)+1)%(P-1)))%P!=0)
return 0;
}
return 1;
}
int main()
{
int a,b,_t=0;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
while (~scanf("%lld%lld%lld%lld",&P,&k1,&b1,&k2))
{
int flag=0;
printf("Case #%d:\n",++_t);
for (int i=1;i<P;i++)
{
a=i; b=P-Pow(a,k1+b1);
if (check(a,b))
flag=1,printf("%d %d\n",a,b);
}
if (!flag) printf("-1\n");
}
return 0;
}
枚举a
n=1时求出b
然后随机化验证是否恒成立
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
ll P,k1,k2,b1;
inline ll Pow(ll a,int b){
ll ret=1;
for (;b;b>>=1,a=a*a%P)
if (b&1)
ret=ret*a%P;
return ret;
}
inline bool check(ll a,ll b){
int Test=300;
while (Test--)
{
int n=rand()%P+1;
if ((Pow(a,(k1*n+b1)%(P-1))+Pow(b,(k2*(n-1)+1)%(P-1)))%P!=0)
return 0;
}
return 1;
}
int main()
{
int a,b,_t=0;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
while (~scanf("%lld%lld%lld%lld",&P,&k1,&b1,&k2))
{
int flag=0;
printf("Case #%d:\n",++_t);
for (int i=1;i<P;i++)
{
a=i; b=P-Pow(a,k1+b1);
if (check(a,b))
flag=1,printf("%d %d\n",a,b);
}
if (!flag) printf("-1\n");
}
return 0;
}
相关文章推荐
- 在windows上下载安装Android sdk
- 有效解决 iOS The document “(null)” requires Xcode 8.0 or later.
- UVA - 10361 Automatic Poetry
- Django通用视图讲解
- Quartz和Spring Task定时任务的简单应用和比较
- UVA-537 Artificial Intelligence?
- ubuntu下git常用命令
- JEDEC DDR2和DDR3 SPECIFICATION区别(持续更新)
- Yii实现的多级联动下拉菜单
- 安卓学习笔记---AndroidStudio快捷键
- 触屏手指滑动计算演示
- toodifficult 题解
- IPC之消息队列
- eclipse 删除所有注释及空白行
- 根据经纬度和半径计算经纬度范围
- 搜索的一些谓词
- C语言常用基础数据类型和变量
- 触屏手指滑动计算演示
- UVA-10815 - Andy's First Dictionary
- docker 常用命令