14年安徽省赛数论题etc.

关于最大公约数的疑惑

题目描述

小光是个十分喜欢素数的人,有一天他在学习最大公约数的时候突然想到了一个问题,他想知道从1到n这n个整数中有多少对最大公约数为素数的(x,y),即有多少(x,y),gcd(x,y)=素数,1<=x,y<=n。但是小光刚刚接触最大公约数,不能解决这个问题,于是他希望你能帮助他解决这个问题。

输入

多组测试数据,对于每组数据:

每行为一个整数N  (1<=N<=10^5)

输出

对于每组数据:

每行输出 (x,y)的个数

样例输入

5

样例输出

5


直接筛法求素数+欧拉函数。在筛法求素数的时候顺便给每个数*(1-1/pi)其中pi为该数的质因子。

然后嘛 这题有点坑  他说的数对竟然是包括相同两个数的数对 以及例如(2,4)及(4,2)这样顺序不同的数对算作两个数对。。。所以我刚打的时候好几遍都不能AC...

贴代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define clr(x) memset(x,0,sizeof(x))
 5 using namespace std;
 6
 7 int a[100001];
 8 int ct[100001];
 9 int pr[100001];
10 void prime(int n);
11 int main()
12 {
13     int n,m,i,j,sum;
14     prime(100000);
15     while(scanf("%d",&n)==1)
16     {
17         sum=0;
18         for(i=1;pr[i]<=n;i++)
19         {
20             j=n/pr[i];
21             sum+=ct[j];
22         }
23         printf("%d\n",sum*2+i-1);
24     }
25
26  }
27 void prime(int n)
28 {
29     clr(a);
30     clr(pr);
31     int num=0;
32      a[0]=a[1]=1;
33      for(int i=1;i<=n;i++)
34        ct[i]=i;
35     ct[1]=0;
36      for(int i=1;i<=n;i++)
37      if(!a[i])
38      {
39          for(int j=i;j<=n;j+=i)
40          {
41              a[j]=1;
42              ct[j]=ct[j]/i*(i-1);
43          }
44          pr[++num]=i;
45      }
46     for(int i=1;i<=n;i++)
47       ct[i]+=ct[i-1];
48     pr[0]=num;
49     return ;
50 }

一道简单的几何变换

题目描述

小光最近在学习几何变换,老师给他留了一个作业,在二维平面上有n个点(x,y),老师给了m个几何变换对n个点进行操作,要求小光输出变换后的n个点的坐标(x’,y’)。小光为了偷懒,请求你帮他写个程序来完成老师的作业。

由于小光刚刚学习几何变换,老师只会给出四种变换,如下:

平移变换: (x’,y’)=(x+p,y’+q)   程序的输入格式为:1 p q  (p,q为整数)

缩放变换: (x’,y’)=(x*L,y*L)    程序的输入格式为:2 L    (L为整数)

上下翻转: (x’,y’)=(x,-y)       程序的输入格式为:3

左右翻转: (x’,y’)=(-x,y)       程序的输入格式为:4

输入

多组测试数据,对于每组数据:

第一行为N(1<=N<=10^5)

然后以下N行,N个点(x,y)  其中x,y均为整数

然后一行为M  (1<=M<=10^5)

然后以下M行,M个变换,输入格式如上所述。

输出

对于每组数据:

输出N行,每行为变换点坐标。

样例输入

2 1 1 2 2 1 1 1 1

样例输出

2 2 3 3


这题也没什么好说的。。其实算不上数论,只是顶着变换的名头= =。然后呢一看数据量如果分别一个一个处理一定会超时。于是就想到了把所有的处理化为一次处理。

然后呢 用ct 代表全部处理过后是否翻转变换 =1为没翻转,=-1为翻转了。两次翻转相当于没翻转。每次翻转后ct=-ct。

用l表示全部处理过后的缩放倍数。

然后平移变换和翻转以及缩放相关,处理比较麻烦,用acum存最后处理完平移的多少。每次平移变换为acum=+a*ct。每次缩放时acum=*t,t为每次缩放变换的大小

对于每个数a[i]处理完后为a[i].x=a[i].x*l*ctx+acumx*ctx;    a[i].y=a[i].y*l*cty+acumy*cty;

代码处理如下:


 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 struct pos{
 5 int x,y;
 6 }a[100001];
 7 int main()
 8 {
 9 int ctx,cty,acumx,acumy;
10 int n,m,k,l,t,p,q;
11 while(scanf("%d",&n)==1)
12 {
13 for(int i=1;i<=n;i++)
14 scanf("%d%d",&a[i].x,&a[i].y);
15 scanf("%d",&m);
16 ctx=cty=l=1;
17 acumx=acumy=0;
18 for(int i=1;i<=m;i++)
19 {
20 scanf("%d",&k);
21 if(k==1)
22 {
23 scanf("%d%d",&p,&q);
24 acumx+=ctx*p;
25 acumy+=cty*q;
26 }
27 if(k==2)
28 {
29 scanf("%d",&t);
30 l*=t;
31 acumx*=t;
32 acumy*=t;
33 }
34 if(k==3)
35 cty=-cty;
36 if(k==4)
37 ctx=-ctx;
38 }
39 for(int i=1;i<=n;i++)
40 {
41 a[i].x=a[i].x*l*ctx+acumx*ctx;
42 a[i].y=a[i].y*l*cty+acumy*cty;
43 printf("%d %d\n",a[i].x,a[i].y);
44 }
45 }
46 return 0;
47 }

时间: 2024-10-06 09:07:01

14年安徽省赛数论题etc.的相关文章

夏令营模拟赛 数论题

求a1x1+a2x2+a3x3+……+anxn = dy中的最小正整数解(是让y的值尽可能的小的正整数) 用图论方法最短路来做,从零点开始,记录d的剩余系中每个点已求得的多项式的最小值,最后0的情况整除d就是最优解(注意a=0的情况) #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<map&

BZOJ3209: 花神的数论题

3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 689  Solved: 334[Submit][Status] Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟蒻又遭殃了.花神的题目是这样的设 sum(i) 表示 i 的二进制表示中 1 的个数.给出一个正整数 N ,花神要问你派(S

14西安区域赛总结帖

14西安区域赛总结帖 ACM 第一次打区域赛,终于可以好好地写一篇总结帖了. 总结帖=口水帖?差不多吧.(在我离开的时候发生了些事情,我现在心情不是很好,我就随便水水吧) 文章结构就用总分总吧. 西安之行在各个方面让我涨了不少姿势. 这次的比赛个人感觉还不错,至少没有发挥失常,而且顺利拿到了铜牌.(感动ing,其实已经做好了打铁的准备,多谢学妈.表妹.zlx.wjx等童鞋的赛前加的buff) 出发前. 比赛前这阶段是非常忙的,要应付各种事情.但是我还是腾出了很多时间来准备比赛,说是准备其实是临时

花神的数论题(数位dp)

规定sum[i] 为i里面含1的个数 ,求从1-N sum[i]的乘积. 数为64位内的,也就是sum[i]<=64的,这样可以dp求出1-N中含k个1的数有多少个,快速幂一下就可以了. 有个地方没开LL ,WA了几次. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #incl

HYSBZ 3209: 花神的数论题

题目连接:http://www.lydsy.com/JudgeOnline/problem.php?id=3209 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1148  Solved: 535[Submit][Status][Discuss] Description 背景众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦.描述话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我等蒟

HYSBZ 3209 花神的数论题(数位dp)

3209: 花神的数论题 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1148  Solved: 535 [Submit][Status][Discuss] Description 背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC -- 当然也包括 CH 啦. 描述 话说花神这天又来讲课了.课后照例有超级难的神题啦-- 我等蒟蒻又遭殃了. 花神的题目是这样的 设 sum(i) 表示 i 的二进制表示中 1 的个数.给出

bzoj3209:3209: 花神的数论题

觉得还是数位dp的那种解题形式但是没有认真的想,一下子就看题解.其实还是设置状态转移.一定要多思考啊f[i][j]=f[i-1][j]+g[i-1][j] g[i][j]=f[i-1][j-1]+g[i-1][j]; 然后我就开始gang.然后先是for for j没有从0开始.然后是cnt增加的时候忘了*,接着是1<<tmp没有用ll,还有是读入优化没有用longlong,最后成功的过了若干较小的数据.WAWAWAWAWA5发.最后发现指数不能直接取模!.终于AC了喜极而泣TAT =>

BZOJ:3209: 花神的数论题

今天居然没参考任何资料解决了这道数位DP,事先只是搞一道数论题练练: 思路:求SUM[1]-SUM[N]的二进制的乘积mod1000000007: N<=10^15;BZOJ的题不会是几个简单的FOR就完结的, 假如N的二进制是:1001001: 位数:1234567 那么当第一位是0的情况:那么数就是000000-111111 序列号:  123456-123456 发现我们可以用排列组合算出二进制有1-6个1的数比如:1个1就是C[6][1],2个1就是C[6][2],...... 当第一位

14年广东省赛,北师邀请赛

特斯拉电动汽车联合创始人兼CEO,私人太空发射公司SpaceX CEO伊隆马斯克(Elon Musk)于5月16日在南加大商学院毕业典礼上发表演讲,他谈到了关于创业的几件重要的事情:一是努力工作;二是吸引优秀人才;三是将核心放在把产品和服务变得更好上;四是不要单一跟着大趋势走. 以下为Elon Musk演讲全文: 谢谢大家,我只有很短的几分钟,我会努力利用好这仅有的时间.在这里我想与大家分享四件重要的事情.其中一些听起来可能像名言警句,但是经历告诉我,它们确实实用. 第一点对于要创业的年轻人非常