列表

详情


NC21884. 函数的魔法

描述

一位客人来到了此花亭,给了女服务员柚一个数学问题:我们有两个函数,F(X)函数可以让X变成(X*X*X+X*X)mod 233。G(X)函数可以让X变成(X*X*X-X*X)mod 233,我们可以任意的对A使用F(X),和G(X),问最少需要多少次使用这两个函数让A变成B。

输入描述

第一行输入一个T,表示T组案例(T<100000),然后输入两个整数A,B,表示我们需要把A变成B。(0<=A<=2000000000,0<=B<=2000000000)

输出描述

输出一个整数表示从A到B最少需要多少次操作,如果不能请输出-1.

示例1

输入:

1
2 186

输出:

2

说明:

我们首先使用F(X),将2变成(2*2*2+2*2)mod 233=12。然后我们再将12通过G(X),变成(12*12*12-12*12)mod 233=186

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 65ms, 内存消耗: 1636K, 提交时间: 2018-12-28 19:26:13

#include<bits/stdc++.h>
#define inf 1000000007
using namespace std;
int d[1000][1000];
int main(){
	for (int i=0;i<233;i++) for (int j=0;j<233;j++) d[i][j]=inf;
	for (int i=0;i<233;i++){
		d[i][(i*i*i+i*i)%233]=1;
		d[i][(i*i*i-i*i)%233]=1;
	}
	for (int k=0;k<233;k++)
		for (int i=0;i<233;i++)
			for (int j=0;j<233;j++) if (d[i][k]+d[k][j]<d[i][j])
				d[i][j]=d[i][k]+d[k][j];
	int tt;scanf("%d",&tt);
	for (;tt--;){
		int a,b;scanf("%d%d",&a,&b);
		if (a==b) puts("0");
		else if (b>=233) puts("-1");
		else if (d[a%233][b]==inf) puts("-1");
		else printf("%d\n",d[a%233][b]);
	}
}

C++11(clang++ 3.9) 解法, 执行用时: 48ms, 内存消耗: 2916K, 提交时间: 2020-02-27 13:16:14

#include<bits/stdc++.h>
#define inf 1000000007
using namespace std;
int d[1000][1000];
int main()
{
	for(int i=0;i<233;i++)
	for(int j=0;j<233;j++)
	d[i][j]=inf;
	for(int i=0;i<233;i++)
	{
		d[i][(i*i*i+i*i)%233]=1;
		d[i][(i*i*i-i*i)%233]=1;
	}
	for(int k=0;k<233;k++)
	for(int i=0;i<233;i++)
	for(int j=0;j<233;j++)
	if(d[i][k]+d[k][j]<d[i][j])
	d[i][j]=d[i][k]+d[k][j];
	int tt;
	scanf("%d",&tt);
	for(;tt--;)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		if(a==b) puts("0");
		else if(b>=233) puts("-1");
		else if(d[a%233][b]==inf) puts("-1");
		else printf("%d\n",d[a%233][b]);
	}
}

上一题