• Maximum splitting(规律,数论)


    You are given several queries. In the i-th query you are given a single positive integer ni. You are to represent ni as a sum of maximum possible number of composite summands and print this maximum number, or print -1, if there are no such splittings.

    An integer greater than 1 is composite, if it is not prime, i.e. if it has positive divisors not equal to 1 and the integer itself.

    Input

    The first line contains single integer q (1 ≤ q ≤ 105) — the number of queries.

    q lines follow. The (i + 1)-th line contains single integer ni (1 ≤ ni ≤ 109) — the i-th query.

    Output

    For each query print the maximum possible number of summands in a valid splitting to composite summands, or -1, if there are no such splittings.

    Example

    Input
    1
    12
    Output
    3
    Input
    2
    6
    8
    Output
    1
    2
    Input
    3
    1
    2
    3
    Output
    -1
    -1
    -1

    Note

    12 = 4 + 4 + 4 = 4 + 8 = 6 + 6 = 12, but the first splitting has the maximum possible number of summands.

    8 = 4 + 4, 6 can't be split into several composite summands.

    1, 2, 3 are less than any composite number, so they do not have valid splittings.

    题意给你一个数让你算出,这个数最多能由多少个合数组成,这里首先要明确什么是合数

    合数的定义:

    数学用语,指自然数中除了能被1和本身整除外,还能被其他的数整除的数。"0"“1”既不是质数也不是合数。

    合数素数

    折叠概念

    除了2之外,所有的偶数都是合数。反之,除了2之外,所有的素数都是奇数。但是奇数包括了合数和素数。合数根和素数根的概念就是用来区分任何一个大于9的奇数属于合数还是素数。任何一个奇数都可以表示为2n+1(n是非0的自然数)。我们将n命名为数根。当2n+1属于合数时,我们称之为合数根;反之,当2n+1是素数时,我们称之为素数根。

    折叠规律

    任何一个奇数,如果它是合数,都可以分解成两个奇数的乘积。设2n+1是一个合数,将它分解成两个奇数2a+1和2b+1的积(其中a、b都属于非0的自然数),则有

    2n+1=(2a+1)(2b+1)=4ab+2(a+b)+1=2(2ab+a+b)+1

    可见,任何一个合数根都可以表示为"2ab+a+b",反之,不能表示为"2ab+a+b"的数根,就称为素数根。由此可以得到合数根表。判断一个大奇数属于合数还是素数,只需在合数根表中查找是否存在它的数根就知道了。

    折叠合数根表

    表中第一行表示a的取值,第一列表示b的取值,其余表示2ab+a+b

    2ab+a+b a=1 a=2 a=3 a=4 a=5 a=6 a=7 a=8 a=9 a=10 a=n
    b=1 4 7 10 13 16 19 22 25 28 31 1+3n
    b=2 7 12 17 22 27 32 37 42 47 52 2+5n
    b=3 10 17 24 31 38 45 52 59 66 73 3+7n
    b=4 13 22 31 40 49 58 67 76 85 94 4+9n
    b=5 16 27 38 49 60 71 82 93 104 115 5+11n
    b=6 19 32 45 58 71 84 97 110 123 136 6+13n
    b=7 22 37 52 67 82 97 112 127 142 157 7+15n
    b=8 25 42 59 76 93 110 127 144 161 178 8+17n
    b=9 28 47 66 85 104 123 142 161 180 199 9+19n
    b=10 31 52 73 94 115 136 157 178 199 220 10+21n
    …… ……
    b=n 1+3n 2+5n 3+7n 4+9n 5+11n 6+13n 7+15n 8+17n 9+19n 10+21n n^2+2n

    折叠意义

    通过研究合数根表,对研究素数的规律会有深远的意义。    


    这道题主要是理解题意,还有几个特判的数1,2,3,5,7,11,

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int main()
    {
    	int q;
    	int p;
    	int i,j;
    	int ans;
    	int num;
    	scanf("%d",&q);
    	while(q--)
    	{
    		scanf("%d",&p);
    		num = p / 4;
    		ans = p % 4;
    		if(ans == 0)
    			printf("%d
    ",num);
    		else if(ans == 1)
    		{
    			if(num > 1)
    				printf("%d
    ",num-1);
    			else
    				printf("-1
    ");					
    		}
    		else if(ans == 2)
    		{
    			if(num > 0)
    				printf("%d
    ",num);	
    			else
    				printf("-1
    ");
    		}				
    		else
    		{
    			if(num > 2)
    				printf("%d
    ",num-1);
    			else
    				printf("-1
    ");				
    		}							
    	}
    	return 0;
    }
    

      

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    第五章 面向方面编程___通知类型
    从 C++ 到ObjectiveC
    iPhone/Mac ObjectiveC内存管理教程和原理剖析(三)@property (retain)和@synthesize的默认实现
    两个操作字符串的方法:读取指定位置的字符和找出某个字符串的位置
    SQLITE3使用总结
    iphone中如何进行多线程编程
    sqlite数据库在IOS中的运用
    重载、覆盖、隐藏
    (转)c/c++ 内存管理
    iPhone/Mac ObjectiveC内存管理教程和原理剖析(四)系统自动创建新的autorelease pool
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7748272.html
Copyright © 2020-2023  润新知