数论专题测试——幸运数字

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 using namespace std;
 7 typedef long long int64;
 8 int64 L;
 9 int ca;
10 int64 phi(int64 x){
11     int64 t=x;
12     for (int64 i=2;i*i<=x;i++){
13         if (x%i==0){
14             t=t/i*(i-1);
15             while (x%i==0) x/=i;
16         }
17     }
18     if (x>1) t=t/x*(x-1);
19     return t;
20 }
21 int64 hs(int64 x,int64 y){
22     long double t1=(long double)x*y/L;
23     int64 t2=x*y;
24     int64 t3=(t2-(long long)t1*L)%L;
25     return t3;
26 }
27 int64 ksm(int64 x,int64 y){
28     if (y==0) return 1;
29     if (y==1) return x%L;
30     int64 d=ksm(x,y/2);
31     if (y%2==1) return hs(hs(d,d),x);
32     else return hs(d,d);
33 }
34 int main(){
35     ca=0;
36     while (1){
37         scanf("%lld",&L);
38         if (L==0) break;
39         if (L%16==0){
40             printf("Case %d: %d\n",++ca,0);
41             continue;
42         }
43         while (L%2==0) L/=2;
44         L*=9;
45         if (L%5==0){
46             printf("Case %d: %d\n",++ca,0);
47             continue;
48         }
49         int64 t=phi(L),tt=sqrt(t),ans;bool fuckpps=1;
50         for (int i=1;i*i<=t;i++){
51             if (t%i) continue;
52             if (ksm(10,i)==1){printf("Case %d: %lld\n",++ca,i);fuckpps=0;break;}
53             if(ksm(10,t/i)==1){ans=t/i;}
54         }
55         if(fuckpps)printf("Case %d: %lld\n",++ca,ans);
56     }
57     return 0;
58 }

题意:找到一个最小的只有数字8的十进制正整数为给定正整数L的倍数,输出其长度。

做法:很容易得到一个式子:(10^x-1)*8/9=0(mod L),(10^x-1)/9是奇数,若L是16的倍数,则无解。否则把L中的2消去,再把8中多余的2去掉,因为(2,L)=1。再同时乘9,把1移过去,变为10^x=1(mod 9L‘),若L’中有质因子5则无解,因为此时10^x不可能与1同余。10与模数互质,根据欧拉定理,可知10^phi(9L‘)=1(mod 9L‘),x一定是phi(9L’)的约数,10不一定是模数的原根。然后枚举约数,快速幂check即可,也可以用bsgs,只是常数大,会TLE。

时间: 2024-07-29 08:56:40

数论专题测试——幸运数字的相关文章

数论专题测试——逆元

题意:给定n,m,令k=1+sigam(inv(i,n))mod 1000000007.   n,m小于等于10^7. 求k^k^k^k....后一个k是前一个k的指数,  求这个值对m的mod,知道指数循环节,这就是个傻逼题,然而考场就是不知道这个,少了点东西,所以出题人就是个傻逼.... 指数循环节:a^b%c=>a^(b%phi(c)+phi(c))   %c (b>=phi(c)). 这个题b永远无限大,就可以使用,可以考虑预处理出10^7范围内的phi,然后递归,当c==1时,返回0

bzoj4568 [Scoi2016]幸运数字

Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A 国.旅行者计划乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国.在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上.然而,幸运是不能简单叠加的,这一点游览者也十分清楚.他们迷

bzoj 4568: [Scoi2016]幸运数字

4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 848  Solved: 336[Submit][Status][Discuss] Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A 国.旅行者计划 乘飞机降落在 x 号城市,沿着 x 号

【bzoj1853】 Scoi2010—幸运数字

http://www.lydsy.com/JudgeOnline/problem.php?id=1853 (题目链接) 今天考试考了容斥,结果空知道结论却不会写= = 题意:求区间中不含6,8两个数字及由6,8组成的数字的倍数的的数有几个 Solution  容斥原理.  先把所有的幸运数字都蒯到一个数组里,将两两之间可以整除的数只留下一个小的.  接下来如果暴力组合统计答案的话肯定会TLE,因为就算去掉了可以被整除的数以后还是有1000多个幸运数组.我们考虑dfs,x记录当前已经枚举到了第几个

2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运算(模二意义下0.1互换,注意前导0也要交换),然后在任意相邻的两个数之间插入二进制与.二进制或,或者二进制异或.现在他想知道这样计算完产生的最美妙的数字是多少. 一共T组数据.对于每组数据,第一行一个n,表示这组数据中一串数有多少个.下面n个非负整数,表示这串数. 样例输入 2 2 3 6 3 1

关于4和7的幸运数字生成方法

所谓的4和7幸运数字指:4.7.44.47.74.77.444-- 第一个幸运数字为4,第七个幸运数字为444 以下采用了两种方法求第n位的幸运数字: 方法一:二进制思想 function luckyNumber(num) { //以4为0,7为1,利用二进制思想,思路参考来自http://blog.csdn.net/f2006116/article/details/52443975 //等比数列求和,要求解2^(n+1)-2<num的n值 var n = Math.floor((Math.lo

[bzoj1853][Scoi2010][幸运数字] (容斥原理)

Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”.lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”. 现

数论专题总结

数论专题总结 kuangbin带你飞之数论基础专题已经刷的差不多了,剩下三道一道中国剩余定理一道离散对数还有一道模拟,模拟那道应该是不会去做了,离散对数的那道看了很多题解一直没有理解题目的思路,只能先暂时放放了,中国剩余定理那道是刘汝佳大白书的例题,暂时没思路也只能先放放了,以后有机会再看下大白书,中国剩余定理已经了解了,离散对数的BSBS模版也有了,虽然这两道变形题暂时不会,但是数论专题部分基础已经有一些了,刷该专题的目标已经完成了,下一专题:kmp. 待补充......

[SCOI2010]幸运数字

题目背景 四川NOI省选2010 题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”.lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“