A-Alexandra and Prime Numbers
题意:
给出一个数N,要求找出一个最小的数M,使得N/M是素数。
分析:
设素数P=N/M,由于要求M尽可能的小,说明P会尽可能的大,但同时P又必须是N的一个素因子,那么我们就可以先找出P,求P的方法是分解素因子(
点击打开链接),只要保证P是N的最大素因子,那么M=N/P。
源代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int MaxFac;
void factor(int n)
{
int a = 1;
for(int i=2; i*i<=n; i+=a,a=2)
{
if(n%i==0) while(n%i==0)
{
MaxFac = i;
n /= i;
}
}
if(n > 1)
MaxFac = n;
}
int main()
{//freopen("sample.txt", "r", stdin);
int n;
while(~scanf("%d", &n))
{
if(n == 1)
puts("0");
else
{
MaxFac = 0;
factor(n);
printf("%d\n", n/MaxFac);
}
}
return 0;
}
B-Alexandra and A*B Problem
题意:
给出一个数a,和一个字符串s,要求找一个尽可能小的数b,使得t=a*b,的一个子串是s。
分析:
可以构造t为 XsY 假设 |Y|=ly |s|=ls 则 t = ( X * 10^ls + s ) * 10^ly +Y
这时t%a==0 这时未知数有 X Y ly 我们可以通过枚举两个计算一个的方式达到枚举所有解的目的
考虑X的范围 我们发现构造的基础是t%a==0 也就是说我们可以只关心“取模”!! 那么X一定在0~a-1之间(这里要特判 如果s以0开头则是1~a-1 这里还要特判 - -b 如果s就是0 那么直接输出0就好了…) 因为a和0对a取模是一样的
这时我们枚举的X最多10^4个 考虑到ly一定比Y小 所以枚举ly 计算Y的方法就是
mod = ( X * 10^ls + s ) * 10^ly % a
Y = ( a - mod ) % a
那么ly有多大?? 明显Y比a小 也就是说ly只有4 所以枚举最多40000次
源代码:
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
#define LL __int64
int main()
{//freopen("sample.txt", "r", stdin);
int a;
LL b, s, t;
char str[10];
while(~scanf("%d%s", &a, str))
{
int len = strlen(str);
if(len==1 && str[0]=='0')
{
puts("0");
continue;
}
b = -1;
LL base = 1;
for(int i=1; i<=len; i++)
base *= 10;
sscanf(str, "%I64d", &s);
for(int i=1; i<=10000; i*=10)
for(int j=(str[0]=='0'); j<a; ++j)
{
t = ((LL)j*base+s) * i;
int mod = (a-t%a) % a;
if(mod < i)
{
t += mod;
if(b<0 || t<b)
b = t;
}
}
printf("%I64d\n", b/a);
}
return 0;
}