The Luckiest number(hdu 2462)

给定一个数,判断是否存在一个全由8组成的数为这个数的倍数

若存在则输出这个数的长度,否则输出0

/*
    个人感觉很神的一道题目。
    如果有解的话,会有一个p满足:(10^x-1)/9*8=L*p 
                              => 10^x-1=9*L*p/8
    设m=9*L/gcd(L,8)
    则存在p1使得 10^x-1=m*p1 
              => 10^x=1(mod m)
    根据欧拉定理 10^φ(m)=1(mod m)
    所以x一定是φ(m)的因数(这好像是某个定理)。 
*/
#include<iostream>
#include<cstdio>
#define lon long long
#define N 400010
#ifdef unix
#define LL "%lld"
#else
#define LL "%I64d"
#endif
using namespace std;
int prime[N],f[N],num,qlen;
lon q[N];
void get_prime(){
    for(int i=2;i<N;i++){
        if(!f[i]) prime[++num]=i;
        for(int j=1;j<=num;j++){
            if(i*prime[j]>=N) break;
            f[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
}
lon gcd(lon a,lon b){
    if(!b) return a;
    return gcd(b,a%b);
}
lon euler(lon x){
    lon res=x;
    for(lon i=2;i*i<=x;i++)
        if(x%i==0){
            res-=res/i;
            while(x%i==0) x/=i;
        }
    if(x>1) res-=res/x;
    return res;
}
void get_q(lon n){
    qlen=0;
    for(int i=1;i<=num&&n>1;i++){
        while(n%(lon)prime[i]==0){
            n/=prime[i];
            q[++qlen]=prime[i];
        }
    }
    if(n>1) q[++qlen]=n;
}
lon mul(lon a,lon b,lon mod){
    lon base=a,r=0;
    while(b){
        if(b&1) r+=base;r%=mod;
        base+=base;base%=mod;
        b>>=1;
    }
    return r;
}
lon poww(lon a,lon b,lon mod){
    lon base=a,r=1;
    while(b){
        if(b&1) r=mul(r,base,mod);
        base=mul(base,base,mod);
        b>>=1;
    }
    return r;
}
int main(){
    int cas=0;lon L;get_prime();
    while(scanf(LL,&L)&&L){
        lon m=9*L/gcd(L,8);
        if(gcd(m,10)>1){
            printf("Case %d: 0\n",++cas);
            continue;
        }
        lon x=euler(m);get_q(x);
        for(int i=1;i<=qlen;i++){
            if(poww(10,x/q[i],m)==1){
                x/=q[i];
            }
        }
        printf("Case %d: ",++cas);
        printf(LL,x);printf("\n");
    }
    return 0;
}

 

 

转载于:https://www.cnblogs.com/harden/p/6517244.html

好的,我可以为您解答这个问题。首先,为了模拟微信发红包的两种发放方式,我们需要了解两种发放方式的具体实现方式。 第一种方式是“平均分配法”,即将红包金额平均分配给每个领取人。这种方式的优点是简单、公平,但缺点是可能会导致某些人领取到的金额较少,无法满足个性化需求。 第二种方式是“随机分配法”,即将红包金额随机分配给每个领取人。这种方式的优点是个性化、趣味性强,但缺点是可能会导致某些人领取到的金额较多,不够公平。 下面是两种方式的具体实现代码: 平均分配法: ```python import random def send_hongbao_1(num, money): avg_money = money / num # 平均每个人分配的金额 money_list = [avg_money for i in range(num)] # 初始化每个人的金额 return money_list ``` 随机分配法: ```python import random def send_hongbao_2(num, money): money_list = [] for i in range(num-1): # 生成一个随机数,表示当前领取人的金额比例 rate = random.uniform(0, 1) money_i = round(money * rate, 2) # 四舍五入保留两位小数 money_list.append(money_i) money -= money_i money_list.append(money) # 最后一个领取人获得剩余的金额 random.shuffle(money_list) # 打乱顺序,增加趣味性 return money_list ``` 以上两个函数分别表示了两种发放方式,其中`num`表示领取红包人数,`money`表示发放金额。这两个函数返回一个列表,表示每个领取人获得的金额。 为了显示红包发放情况,并打印红包运气王的名单,我们可以在两个函数中加入一些输出语句: ```python def send_hongbao_1(num, money): avg_money = money / num money_list = [avg_money for i in range(num)] print("红包发放情况:") for i in range(num): print("第{}个人获得了{}元".format(i+1, money_list[i])) max_money = max(money_list) luckiest = [i+1 for i, j in enumerate(money_list) if j == max_money] print("红包运气王是:", luckiest) return money_list def send_hongbao_2(num, money): money_list = [] for i in range(num-1): rate = random.uniform(0, 1) money_i = round(money * rate, 2) money_list.append(money_i) money -= money_i money_list.append(money) random.shuffle(money_list) print("红包发放情况:") for i in range(num): print("第{}个人获得了{}元".format(i+1, money_list[i])) max_money = max(money_list) luckiest = [i+1 for i, j in enumerate(money_list) if j == max_money] print("红包运气王是:", luckiest) return money_list ``` 上述代码中,`max_money`表示领取金额最多的人获得的金额数,`luckiest`表示获得最多金额的人的编号列表。 最后,如果您想从`.xlsx`表格中抽取人物,可以使用`pandas`库中的`read_excel`函数读取表格,并使用`sample`函数随机抽取人物。示例代码如下: ```python import pandas as pd df = pd.read_excel('人物表.xlsx') people_list = df['姓名'].tolist() # 获取所有人物的姓名列表 selected_list = random.sample(people_list, num) # 随机抽取num个人物 ``` 以上代码中,`num`表示需要抽取的人数。`people_list`表示所有人物的姓名列表,`selected_list`表示随机抽取的人物姓名列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值