d(ij)表示 i*j 的约数的个数,[ n/i ] [ m/j ] 向下取整,[ gcd(i,j)==1 ]返回式子 gcd(i,j)==1 的 bool 值 (题目:BZOJ 3994)
②:
任意进制的转换: 在网上看到的博客
题目:PKU1220 思路:直接套用即可
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
using namespace std;
typedef long long LL;
const LL MAXN=105000+23;
#define fi first
#define se second
#define point pair<double,double>
int n,m;
char c[100000+23],s[100000+23],ans[100000+23];
char change1(int x)
{
if(x<10)return '0'+x;
else if(x<36)return 'A'+x-10;
else return 'a'+x-36;
}
int change2(char x)
{
if(x<='9')return x-'0';
else if(x<='Z')return x-'A'+10;
else return x-'a'+36;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%s",&n,&m,c);
int l1=strlen(c),l2=0,l3=0,f=1;
printf("%d %s\n",n,c);
while(!(l1==1&&c[0]=='0'))
{
l2=0;
int sum=0,flag=0;
for(int i=0;i<l1;i++)
{
int x=change2(c[i]);
sum=sum*n+x;
if(sum>=m)flag=1;
if(flag)s[l2++]=change1(sum/m);
sum%=m;
}
//printf("%s\n",s);
if(l2==0)l2++,s[0]='0';
for(int i=0;i<l2;i++)
{
c[i]=s[i];
}
l1=l2;
if(sum>=1)f=1;
if(f)ans[l3++]=change1(sum);
}
if(l3==0)
{
printf("%d %c\n",m,'0');
puts("");
continue;
}
ans[l3]=0;
printf("%d ",m);
f=0;
for(int i=l3-1;i>=0;i--)
{
if(change2(ans[i])>0)f=1;
if(f)putchar(ans[i]);
}
puts("");
puts("");
}
return 0;
}