zoj3707(Calculate Prime S)解题报告

1.计算(a/b)%c,其中b能整除a

设a=b*r=(bc)*s+b*t

则(b*t)为a除以bc的余数

r=c*s+t

(a/b)%c=r%c=t

(a%bc)/b=(b*t)/b=t

所以对于b与c互素和不互素都有(a/b)%c=(a%bc)/b成立。

当bc不大时,先取模bc,再除b

如果b与c互素,则(a/b)%c=a*b^(phi(c)-1)%c

待证

2.与集合子集

斐波那契数列的第n+2项同时也代表了集合{1,2,...,n}中所有不包含相邻正整数的子集个数。

证明:归纳法证明——

n=1时,相应子集个数为2,为f(3);

n=2时,相应子集个数为3,为f(4);

n>=3时,若集合{1,2,...,n-2}的相应子集为f(n),集合{1,2,...,n-1}的相应子集为f(n-1)

则对于集合{1,2,...,n}:

包含n的子集(即不包含n-1,在最大项可以为n-2的子集基础上加上数字n)个数为f(n)

不包含n的子集个数为f(n+1)(最大项可以为n-1的子集)

所以集合{1,2,...,n}的相应子集为f(n)+f(n+1)=f(n+2)

所以得证

3.gcd(fib(n),fib(m))=fib(gcd(n,m))

待证

当一个数n与其它数m的最大公约数为为1或2时,则fib(n)和fib(m)的最大公约数为fib(1)或fib(2),为1。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <stdbool.h>
  4 #include <malloc.h>
  5 #include <memory.h>
  6
  7 #define ansnum 20000000
  8 #define anszhi 2000000
  9
 10 struct node
 11 {
 12     long long mat[2][2];
 13 };
 14 long *zhi;
 15 bool *vis;
 16 long yu;
 17
 18 void Prime()
 19 {
 20     long i,j,ans=0;
 21     memset(vis,true,sizeof(bool)*ansnum);
 22     for (i=2;i<ansnum;i++)
 23     {
 24         if (vis[i])
 25         {
 26             ans++;
 27             zhi[ans]=i;
 28         }
 29         for (j=1;j<=ans;j++)
 30         {
 31             if (i*zhi[j]>=ansnum)
 32                 break;
 33             vis[i*zhi[j]]=false;
 34             if (i%zhi[j]==0)
 35                 break;
 36         }
 37     }
 38     zhi[1]=3;
 39     zhi[2]=4;
 40 }
 41
 42 struct node count_mat(struct node a,struct node b)
 43 {
 44     long i,j;
 45     struct node c;
 46     for (i=0;i<2;i++)
 47         for (j=0;j<2;j++)
 48             c.mat[i][j]=(a.mat[i][0]*b.mat[0][j]
 49                 +a.mat[i][1]*b.mat[1][j])%yu;
 50     return c;
 51 }
 52
 53 long fib(long t)
 54 {
 55     struct node m,r;
 56     m.mat[0][0]=0;
 57     m.mat[0][1]=1;
 58     m.mat[1][0]=1;
 59     m.mat[1][1]=1;
 60
 61     r.mat[0][0]=1;
 62     r.mat[0][1]=0;
 63     r.mat[1][0]=0;
 64     r.mat[1][1]=1;
 65     t--;
 66     while (t)
 67     {
 68         if ((t & 1)==1)
 69             r=count_mat(r,m);
 70         t>>=1;
 71         m=count_mat(m,m);
 72     }
 73     return (r.mat[0][0]+r.mat[0][1])%yu;
 74 }
 75
 76 int main()
 77 {
 78     vis=(bool *) malloc (sizeof(bool)*ansnum);
 79     zhi=(long *) malloc (sizeof(long)*anszhi);
 80     long n,k,x,m,i,j;
 81     Prime();
 82     scanf("%ld",&n);
 83     for (i=1;i<=n;i++)
 84     {
 85         scanf("%ld%ld%ld",&k,&x,&m);
 86         yu=x;
 87         for (j=zhi[k];;j++)
 88             if (fib(j)==0)
 89                 break;
 90         yu=x*m;
 91         printf("%ld\n",fib(j)/x);
 92     }
 93     return 0;
 94 }
 95 /*
 96 5
 97 5 13 10
 98 1 11 3
 99 5 2 5
100 5 5 6
101 1000000 100 1000000
102 */
时间: 2024-10-01 22:47:40

zoj3707(Calculate Prime S)解题报告的相关文章

USACO Section1.5 Prime Palindromes 解题报告

pprime解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 求a到b之间的所有回文素数(即又是素数又是回文数的数).[数据范围] 5<=a,b<=100,000,000[输入样例] 5

USACO Section1.3 Prime Cryptarithm 解题报告

crypt1解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 用给出的N个数字,替换以下竖式,能生成多少个正确的竖式? * * * x * * ------- * * * * * * ---

解题报告 之 HOJ2276 SOJ2498 Count prime

解题报告 之 HOJ2276 SOJ2498 Count prime Description Given an integer interval [L, R](L <= R <= 2147483647, R - L <= 1000000), please calculate the number of prime(s) in the interval. Input There is one line in the input, which contains two integer: L,

ACdream 1203 - KIDx&#39;s Triangle(解题报告)

KIDx's Triangle Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description One day, KIDx solved a math problem for middle students in seconds! And than he created this problem. N

解题报告【pat-1076】

最近一直在忙项目都没时间好好总结写博客,说起来真实惭愧啊. 下面就把自己最近做的几题好好总结一下,主要记录一些注意点,以防以后遇到再犯. 1076. Forwards on Weibo (30) 时间限制 3000 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Weibo is known as the Chinese version of Twitter.  One user on Weibo may have many

济南-1030试题解题报告

By shenben 本解题报告解析均为100分解题思路. 上午 T1 题意:从1− n中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数 最大可能是多少. 解析: 1.  质因数分解 2.  1->n用质因数指数的相加的形式将1*n累乘起来 3.  扫一遍指数为奇数的质因数都-1,偶数的不变 4.  快速幂乘一遍,同时取模 T2 题意:有n个数,随机选择一段区间,如果这段区间的所有数的平均值在[L,R]中则 你比较厉害.求你比较厉害的概率 解析:(暴力枚举 40分) 100分需要推式子

pat解题报告【1078】

1078. Hashing (25) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The task of this problem is simple: insert a sequence of distinct positive integers into a hash table, and output the positions of the input numbers.  The hash fun

POJ3728 The merchant解题报告

Description There are N cities in a country, and there is one and only one simple path between each pair of cities. A merchant has chosen some paths and wants to earn as much money as possible in each path. When he move along a path, he can choose on

解题报告 之 SOJ2666 分解 n!

解题报告 之 SOJ2666 分解 n! Description 给你一个数 n (1 < n <= 1000000) ,求 n! (n的阶乘)的质因数分解形式,质因数分解形式为 n=p1^m1*p2^m2*p3^m3-- * 这里 p1 < p2 < p3 < -- 为质数 * 如果 mi = 1, 则 ^ mi 就不需要输出 Input 输入是多case的,每行一个数n,1 < n <= 1000000,当n等于0时输入结束 Output 每个n输出一行,为它