摘要:题意:把一个数拆成素数,从小到大排列。如果把素数全部存起来大概快一半的样子#include<stdio.h>#include<string.h>#define Max 65540int n,prime[Max+5],num[Max],c = 0;void DFS( int x ){ if( x == 0 ) return ; for( int i = 0; i < c; ++i ) { if( x % num[i] == 0 ) { printf( x == n?"%d":"*%d",num[i] ); DFS( x / n
阅读全文
摘要:这题用素数筛选法。。。。 不过数组要开大点。。。 否则会挂掉去#include<stdio.h>#include<string.h>#define max 1 << 15 + 1int num[max + 5],n;void fun( ){ memset( num,0,sizeof( num ) ); num[0] = num[1] = 1; for( int i = 2; i <= max / 2; ++i ) if( !num[i] ) for( int j = i + i; j <= max; j += i ) num[j] = 1;}in
阅读全文
摘要:这题一看是水,二看还是水,最后一做就挂了,归咎于数组越界啊。我却全然不知。。。。 //62MS水过#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<ctype.h>#define Max 1000005int num[Max + 1];inline int cal( int i )//用内联快很多{ int sum = i; while( i ) { sum += i % 10; i /= 10; } return sum;}vo
阅读全文
摘要:这题要用到筛选法的思想,否则直接TLE,这题我很郁闷,原以为这题用这种方法肯定要超时的,就一直不敢用,没想到水了.郁闷#include<stdio.h>#include<string.h>int n,num[40000];int main( ){ int t; scanf( "%d",&t ); num[0] = num[1] = 0; while( t-- ) { scanf( "%d",&n ); memset( num,0,sizeof( num ) ); for( int i = 2; i <= n
阅读全文
摘要:开始我直接打表一直不能过,后来知道有删选法这一东西,水过62MS#include<stdio.h>#include<string.h>int num[100005],c[100005];void shuaixuan( )//筛选法{ memset( num,0,sizeof( num ) ); for( int i = 2; i < 100005; ++i ) for( int j = 2; i * j < 100005; ++j ) num[i*j] = 1;}void chart( )//预处理{ num[1] = 1; memset( c,0,size
阅读全文
摘要:这题我开始暴力,结果TLE,后来想到这种题应该都有精简的方法,就去网上搜,没想到新学了一招,筛选法,估计最小公倍数也能这样做了,哈哈#include<stdio.h>#include<string.h>long long num[500005];void shaixuan( ){ for( int i = 1; i < 500005; ++i ) num[i] = 1; for( int i = 2; i < 500005; ++i ) for( int j = 2; j * i < 500005; ++j ) num[i*j] += i; }int
阅读全文