【POJ3904】【P1202】水晶密码

说是莫比乌斯反演,其实只是玩儿玩儿内个miu函数而已……

原题:

wty  打算攻击 applepi  的用来存放机密数据的水晶系统。 applepi 早有察觉,于是布置了一个密码系统来防备 wty 的攻击。 wty 经过研究发现,applepi 的密码系统中最关键的部分在于一 串四个正整数组成的密钥,四个正整数的顺序可以任意排列, 并且这四个正整数的最大公约数为 1。
wty 已经成功地把这四个正整数限制在了 N 个正整数构成的集合中,但是,密钥的数目 可能仍然是很庞大的。wty  希望知道有多少组可能的密钥。当然,applepi  已经挫败了 wty 的阴谋,但是他对这个问题也是饶有兴趣的。所以说,现在你需要帮助 applepi 算出有多少 组可能密钥,为 applepi 评估他的水晶系统的安全性提供参考。

N≤10000,集合中的数不大于 10000

题目要求四个数gcd为1,可以求出不为1的有几个,然后用总数减

先通过枚举数来求出共有num[i]个数含有因子i,c(num[i],4)即为gcd为i的情况个数,使用容斥去掉2*3和6这样的重复计算即可

手玩小数据可以发现,搞容斥的+或-的情况刚好和miu符合,比如2应该-,miu就是-1,6应该+,miu就是1之类的,所以就可以直接用miu来计算是过程变得更高端

核心代码:if(_num>=4)  ans+=miu[k]*_num*(_num-1)*(_num-2)*(_num-3)/24;

需要注意一点,求num[i]的时候直接枚举会T,要用sqrt优化,最后根据miu求ans的时候是直接从1枚举到maxx(最大的内个数),但是求num[i]的时候不能枚举到sqrt(maxx),而是枚举到sqrt(a[i])

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int read(){int z=0,mark=1;  char ch=getchar();
 8     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)mark=-1;  ch=getchar();}
 9     while(ch>=‘0‘&&ch<=‘9‘){z=(z<<3)+(z<<1)+ch-‘0‘;  ch=getchar();}
10     return z*mark;
11 }
12 int n,a[51000];
13 bool kang[51000];  int zhi[51000],ztop=0;
14 int miu[51000];
15 int num[510000];
16 void get_miu(){
17     memset(kang,0,sizeof(kang));
18     miu[1]=1;
19     for(int i=2;i<=50000;i++){
20         if(!kang[i]){  zhi[++ztop]=i;  miu[i]=-1;}
21         for(int j=1;zhi[j]*i<=50000;j++){
22             kang[zhi[j]*i]=true;
23             if(i%zhi[j]==0){  miu[zhi[j]*i]=0;  break;}
24             miu[zhi[j]*i]=-miu[i];
25         }
26     }
27 }
28 int main(){//freopen("ddd.in","r",stdin);
29     get_miu();
30 while(scanf("%d",&n)!=EOF){
31     memset(num,0,sizeof(num));
32     int maxx=0;
33     for(int i=1;i<=n;i++){  a[i]=read();  maxx=max(maxx,a[i]);}
34     if(n<4){  cout<<0<<endl;  continue;}
35     for(int i=1;i<=n;i++){
36         int smax=int(sqrt(a[i]*1.0));
37         for(int j=1;j<=smax;j++)if(a[i]%j==0){
38             num[j]++;
39             if(a[i]/j!=j)  num[a[i]/j]++;
40         }
41     }
42     long long ans=0;
43     for(int k=1;k<=maxx;k++){
44         long long _num=num[k];
45         if(_num>=4)  ans+=miu[k]*_num*(_num-1)*(_num-2)*(_num-3)/24;
46     }
47     cout<<ans<<endl;
48 }
49     return 0;
50 }

时间: 2024-11-13 07:58:20

【POJ3904】【P1202】水晶密码的相关文章

C# 用vs2008连接SQL数据库做动态水晶报表

博主是个还在上大学的新手,如果有什么说错的地方请务必帮我指出来,谢谢! 想要完成一个能够动态改变其中数据的水晶报表,可以通过创建一个 数据的中转站来存储和输出数据的方式. 借由这个中转站,我们可以通过为它动态输入数据,然后再将数据导出到水晶报表,来达到得到有动态数据的水晶报表的目的. 仅在vs2008中,很多它自带的应用也可以达到中转站的作用,比如数组,数据集等. 博主最近刚在学SQL所以尝试了用VS连接数据库来做水晶报表. 1.首先,博主在SQL中创建了名为xxs的数据库,然后再在数据库xxs

水晶报表取消输入密码最后测试结果

哈哈,找了很多资料终于解决了. //添加引用 using CrystalDecisions.Shared ;//负责解释TableLogOnInfo类using CrystalDecisions.CrystalReports .Engine ;//负责解释ReportDocument类private void Page_Load(object sender, System.EventArgs e) //然后在水晶报表的Load事件中使用以下代码 private void crystalRepor

关于vs2010下水晶报表的使用入门

关于vs2010下使用水晶报表了解情况记录如下: 1.首先vs2010不再自带水晶报表控件了,需要下载安装vs2010配套的水晶报表控件:CRforVS_13_0.这个控件安装很简单,基本上都选择默认设置就可以了. 2.安装之后,再在vs2010中添加新项,选中reporting,下面就有CrystalReports的选项了,这个就是水晶报表文件. 3.新建一个CrystalReports文件,vs2010会弹出一个水晶报表模版生成向导,可以根据向导指示,一步一步的生成自己需要的报表文件.这里我

水晶报表密钥

序列号:密钥 : AV860-01CS00G-U7000NC注册号: 1231467890 http://ftp.crystaldecisions.com/outgoing/Products/CR10DevEn.exehttp://ftp.crystaldecisions.com/outgoing/Products/CR10DevEn.exe 这个是.NET自带的水晶报表的注册码 注册号:6707437608 密码:AAP5GKS0000GDE100DS c#水晶报表注册注册号: 6707437

C#水晶报表教程

http://apps.hi.baidu.com/share/detail/24298108 水晶报表是一个功能强大的报表工具,现在已经被Microsoft Visual Studio 2005(下文以VS2005简称)集成在一起.喜欢水晶报表的朋友可以方便使用了.我把水晶报表在vs2005的使用方法总结一下,供大家参考.首先介绍一下我用的软件环境:Microsoft Visual Studio 2005:Microsoft SQL Server 2005[数据用例]服务器:SQLEXPRESS

Asp.Net中使用水晶报表

Asp.Net中使用水晶报表(上) 在我们对VS.Net中的水晶报表(Crystal Reports)进行研究之前,我和我朋友对如何将这个复杂的东东加入我们的Web应用有着非常的好奇心.一周以后,在阅读了大量的“HOWTO”文档之后,我们成功地将一些简单的报告加入到了我们的Asp.net程序中,并得到了一些小决窍. 这篇文章教你如何在.Net Web应用中使用水晶报表,也可以让你在学习过程中少走一些弯路.为了得到最好的效果,读者最好需要有一些基础的Asp.Net访问数据库的知识以及使用VS.Ne

c# 水晶报表的设计(非常的基础)

最近在公司实习,由于公司需要用到的一种叫做水晶报表的神奇的东东,老大就叫我们学习学习.怕自己以后忘了,也为了以后阅读方便,将其记录下来. 使用工具:vs2008 基本方法一.使用水晶报表的推模式 步骤1.当前解决方案,右键->添加->新建项,选择数据集 步骤2.更改数据集名后选择添加,为了方便我这里没有改名,得到如下的数据集设计界面 步骤3.在上面界面的左面有一个工具栏点击datatable,在右面空白处单击左键,得到一个table,可以对该table进行重名. 步骤4.我们选择添加该数据集的

水晶报表制作实例

水晶报表貌似是比较"古老"的报表技术了,它是由SAP公司开发的报表产品,通过安装开发包可以在VS中集成Crystall Reports设计器.通过可视化的设计和操作,可以完成报表的制作.正好最近有空帮朋友一个小忙,他也提到了使用水晶报表技术完成报表的批量打印和导出.N年不用水晶报表了,正好练练手. 开发工具我们选用目前主流的VS2010旗舰版.VS2010默认是不集成水晶报表的,需要安装开发包CRforVS_13_0.exe.这里我提供一个下载地址,方便大家下载安装. http://y

飞塔防火墙快速初始化管理员密码

1. 准备好串口线和Secure-CRT软件,下图为串口线的图片:USB接口转RJ45(水晶头) 2. 打开Secure-CRT软件,设置好相应的连接参数,具体如下 console的端口可以通过右键我的电脑图标,选择管理选项,在设备管理器查看我们对应的COM口是多少,这里我的电脑是COM3 端口:COM3 波特率:9600 数据位:8 奇偶校验:None 停止位:1 流控:都不勾选 3. 将防火墙进行加电,通过Secure-CRT软件我们可以看到串口线的输入信息.当提示我们输入账号密码的时候,我