关于模运算的性质

题目:http://codeforces.com/gym/100792/problem/A

题意:在一个b进制的数字系统下。如果x和y(均用b进制表示)的长度相等且组成的数字相同(只是排列不同),那么x和y叫做b-anagram.

           一个数k如果叫做b-stable那么对于这个数所有的倍数他们都互相成为b-anagram.

          给定一个b求所有的k.

解答:定义一个数k.把写成b进制的方式如ABCDE.然后再把它写成十进制的方式.显然它模k等于0.如果abcde重新排列仍然是k的倍数的话,那么b的0次方、1次方、2次方。。。模k都等于1(因为b的0次方等于1)。那么可以得出结论。这个b模k肯定等于1.那么如果b模k等于1.如果从1开始扫扫到b会超。考虑b-1模k等于0.然后寻找所有b-1模k等于0的 k.(它只用扫根号b次)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int arr[100000];
int main()
{
    int n;
    scanf("%d",&n);
    n--;
    int pos = 0;
    for(int i = 1;i <= (int)sqrt(n);i++)
    {
        if(n % i == 0)
        {
            arr[pos++] = i;
            arr[pos++] = n/i;
        }
    }
    sort(arr,arr+pos);
    printf("1");
    for(int i = 0;i < pos;i++)
    {
        if(i)
        {
            if(arr[i]!=arr[i-1])
                printf(" %d",arr[i]);
        }
    }
    printf("\n");
    return 0;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值